考虑您的示例和输出(除了我将初始值x
设为 22):
int i=0;
int a=5;
int x=22;
for(i=0; i<5; x=(i++,a++))
{
printf("i=%d a=%d x=%d\n",i,a,x);
}
印刷:
i=0 a=5 x=22
i=1 a=6 x=5
i=2 a=7 x=6
i=3 a=8 x=7
i=4 a=9 x=8
请注意,x
在循环之前具有 x 的初始值,或者在循环的最后一次行程中具有先前的值。
回想一下,任何for
循环都可以表示为等价while
循环。
for
循环:
for(exp 1; exp 2; exp 3){
expressions
}
相当于:
exp 1;
while(exp 2){
expressions
exp 3;
}
所以你的for
循环可以写成:
int i=0; // exp 1 from the for loop
int a=5;
int x=22;
while(i<5){ // exp 2
// loop body
printf("i=%d a=%d x=%d\n",i,a,x);
x=(i++,a++); // exp 3 from the for loop
}
打印相同的输出。
在循环结束时评估的事实exp 3
(无论是 for 还是 while 循环)就是为什么x
在循环体中有 x 的先前值。
最后要考虑的是逗号运算符。表达方式:
i=(a+=2, a+b)
^^^ evaluate a then add 2
^ comma operator in this case
^^ add b to a
^ store the final expression -- the RH of the comma operator --
into i