我正在玩弄数组指针的概念。我写了这个简单的程序:
#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
递增之前块执行。我使用后增量表示法重写了程序,并得到了完全相同的结果,这证实了我的假设。如果是这种情况,那么他们在这个程序中如何区别对待?
答案 0 :(得分:3)
for
循环的增量表达式在正文后执行。对于你的情况
for (i = s; *i; ++i){
printf(i);
}
类似于
i = s; // loop init
while (*i) // loop condition
{
printf(i);
++i; // loop increment
}
答案 1 :(得分:3)
for (initialization; condition; increase) statement;
此for
按以下方式运作:
initialization
已执行。通常,这会声明一个计数器变量,并将其设置为某个初始值。这在循环开始时执行一次。
condition
已检查。如果是true
,则循环继续;否则,循环结束,并跳过statement
,直接进入第5步。
statement
已执行。像往常一样,它可以是单个语句,也可以是用大括号{}包围的块。
increase
被执行,循环返回到第2步。
循环结束:执行后继续执行下一个语句。
postincrement和preincrement之间没有区别,因为increase
无论如何都是单独执行的。
答案 2 :(得分:2)
我被设置为s的开头,检查布尔条件并保持为真,然后我增加并执行该块。
不完全。实际语法是
i
设置为s
的开头
检查布尔条件
2.1。如果它成立,则块执行,
2.2。否则就会失控。
然后i
递增并继续执行第2步。
注意:在此特定情况下,i
的前后增量不会有任何差别。
答案 3 :(得分:1)
相当于
for( a ; b ; c )
{
statements
}
是
a ;
while( b )
{
statement
c ;
}
和
++i ;
i++ ;
是相同的事情,因为我只被评估并且没有使用评估
答案 4 :(得分:1)
原因是,在for循环中,我使用了预增量表示法。我被设置为s的开头,检查布尔条件并保持为真,然后我增加并执行该块。
没有。 块执行后,i
递增。
我使用后增量表示法重写了程序,并得到了完全相同的结果,证实了我的假设。如果是这种情况,那么他们在这个程序中如何区别对待?
他们不是。后增量或预增量不会造成盲点差异。这两者之间的区别在于表达式i++
,++i
的结果(即,它将评估为前一个值还是新值?)。它不会神奇地改变封装控制结构的整个流程。只要你提供一个导致i
递增的表达式,就会抛弃增量表达式的评估结果,因此它并不重要。
这就是这个:
int main()
{
int x = 5;
int y = 5;
int a = x++;
int b = ++y;
}
将导致a
和b
的值不同,因为使用了增量表达式的结果,而以下程序:
int main()
{
int x = 5;
x++;
}
int main()
{
int x = 5;
++x;
}
是完全相同的。
答案 5 :(得分:0)
在块执行后我会增加。
试试这个:
for(int i = 0; i < 5; ++i )
{
printf("\n %d",i);
}