【发布时间】: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 之前都不会执行增量。
标签: c arrays pointers pre-increment