c语言 - for(i=0; i<5; x=(i++,a++)) 如何工作



我不明白这是怎么回事,为什么会产生输出如下:

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++做它一直做的事情;返回当前值,然后对变量进行递增。所以xa加1之前的值,然后a的值加1。因为i++也被求值了,所以它的值也增加了。

我想你是这样理解for循环的:

for(i=0; i<5; i++)

你可能还想增加两个变量;如果你用逗号分隔它们;这样的:

for(i=0; i<5; i++,a++)

在每个循环开始时,ia都将被加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

相关内容

  • 没有找到相关文章