字符指针的预增量[重复]
Posted
技术标签:
【中文标题】字符指针的预增量[重复]【英文标题】:Preincrement in character pointers [duplicate] 【发布时间】:2015-05-15 19:28:11 【问题描述】:我在玩弄数组指针的概念。我写了这个简单的程序:
#include <stdio.h>
int main (int argc, char **argv)
char s[] = "Hello world!\n";
char *i;
for (i = s; *i; ++i)
printf(i);
return 0;
这给出了非常有趣的输出:
Hello world!
ello world!
llo world!
lo world!
o world!
world!
world!
orld!
rld!
ld!
d!
!
然而,当我写这篇文章时,我的印象是输出将从第二行开始。原因是,在 for 循环中,我使用了预增量符号。 i
设置为s
的开头,检查布尔条件并且它成立,然后i
递增并执行块。
这是我的印象,但显然这是错误的,因为块在 i
递增之前执行。我使用后增量符号重写了程序,得到了完全相同的结果,这证实了我的假设。如果是这样,那么他们在这个程序中如何区别对待?
【问题讨论】:
增量 ++i 发生在循环体执行之后。所以在第一个循环中 i == s 是真的。 在for
循环中,输入++i
或i++
作为第三个参数并不重要。这与使用i++;
和++i;
相同。只要它们没有在表达式中使用,这两者都是等效的,如下面的答案所示。
@pmg 这不是他感到困惑的原因;无论他使用的是 ++i 还是 i++,在 for 循环中第一次测试 *i 之前都不会执行增量。
【参考方案1】:
for
循环的增量表达式在主体之后执行。对于你的情况
for (i = s; *i; ++i)
printf(i);
类似于
i = s; // loop init
while (*i) // loop condition
printf(i);
++i; // loop increment
【讨论】:
【参考方案2】:i 在块被执行后递增。
试试这个:
for(int i = 0; i < 5; ++i )
printf("\n %d",i);
【讨论】:
【参考方案3】:for (initialization; condition; increase) statement;
for
的工作方式如下:
initialization
被执行。通常,这会声明一个计数器变量,并将其设置为某个初始值。这在循环开始时执行一次。
condition
已检查。如果是true
,则循环继续;否则,循环结束,跳过statement
,直接进入第5步。
statement
被执行。像往常一样,它可以是单个语句,也可以是用花括号 括起来的块。
increase
被执行,循环回到步骤2。
循环结束:继续执行它之后的下一条语句。
postincrement 和 preincrement 没有区别,因为increase
无论如何都是单独执行的。
【讨论】:
【参考方案4】:相当于
for( a ; b ; c )
statements
是
a ;
while( b )
statement
c ;
和
++i ;
i++ ;
是相同的东西,因为 i 只被评估,而评估没有被使用
【讨论】:
【参考方案5】:i 设置为 s 的开头,检查布尔条件并且它为真,然后 i 递增并且块执行。
不完全是。实际语法是
i
设置为s
的开头
检查布尔条件
2.1。如果它成立,则块执行,
2.2。否则退出循环。
然后i
递增并继续执行第 2 步。
注意:在这种特殊情况下,i
的前后增量不会有任何区别。
【讨论】:
【参考方案6】:原因是,在 for 循环中,我使用了预增量符号。 i 设置为 s 的开头,检查布尔条件并成立,然后 i 递增并执行块。
没有。 i
在块执行后递增。
我使用后增量符号重写了程序,得到了完全相同的结果,这证实了我的假设。如果是这样,那么他们在这个程序中如何区别对待?
他们不是。后增量或前增量不会产生盲目的差异。这两者之间的区别在于表达式i++
、++i
的结果(即,它会计算为先前的值还是新的值?)。它不会神奇地改变封装控制结构的整个流程。增量表达式的计算结果只是被丢弃了,所以只要您提供一个导致增量 i
的表达式,您做什么都没有关系。
是这样的:
int main()
int x = 5;
int y = 5;
int a = x++;
int b = ++y;
将导致a
和b
的值不同,因为使用了增量表达式的result,而以下程序:
int main()
int x = 5;
x++;
int main()
int x = 5;
++x;
是相同的。
【讨论】:
以上是关于字符指针的预增量[重复]的主要内容,如果未能解决你的问题,请参考以下文章