我不明白这是怎么回事,为什么会产生输出如下:
int main()
{
int i=0;
int a=5;
int x=0;
for(i=0; i<5; x=(i++,a++))
{
printf("i=%d a=%d x=%dn",i,a,x);
}
}
输出:
i=0 a=5 x=0
i=1 a=6 x=5
i=2 a=7 x=6
i=3 a=8 x=7
i=4 a=9 x=8
暂时不考虑++
,它们只是分散注意力。
int a = 5;
int i = 0;
int x = (i, a);
设置x
的值为5。i
求值并丢弃,a
求值并赋值给x
。
在循环中,后增量a++
做它一直做的事情;返回当前值,然后对变量进行递增。所以x
取a
加1之前的值,然后a
的值加1。因为i++
也被求值了,所以它的值也增加了。
我想你是这样理解for循环的:
for(i=0; i<5; i++)
你可能还想增加两个变量;如果你用逗号分隔它们;这样的:
for(i=0; i<5; i++,a++)
在每个循环开始时,i
和a
都将被加1。现在只需要解释表达式x=(i++,a++)
:x
获取分配的两个值中的最后一个。这就相当于:
x=i++;
x=a++;
当然a是后加的,所以首先将它的值赋给x;只有这样a才会加1
这很简单,你使用的两个操作符都是'后增量',这意味着赋值将首先发生,然后变量的增量将发生。让我们用一个例子来理解,假设,
i=5
x=i++;
printf("%d", x)
上面的代码将输出为5和
i=5
x=++i;
printf("%d", x)
,输出为6。
希望你明白其中的逻辑。
逗号操作符表示:执行所有操作,并返回最后一个值;
的例子:
A = (b+=1,c+2,d+1);
这个句子将把1加到b,把2加到c(但不修改它),把1加到d。因此d+1是A将被设置为其值的最后一个表达式。
post和pre操作符++比较棘手。
a++的意思是:返回A的值,然后增加它的值。++A的意思是:增加A,然后返回它的值。
所以如果A=2
b=A++; // set b to 2 and increments A one unity
b=++A; // increments A to 4 and sets b to 4
考虑您的示例和输出(除了我使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=%dn",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=%dn",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