递减运算符如何在while语句中工作?

时间:2013-07-30 14:02:13

标签: c while-loop decrement

我在C中有以下代码源:

#include<stdio.h>

void main()
{
    int i=0, x=3;
    while((x---1))
    {
        i++;
    }
    printf("%d", i);
}

这个while语句是如何工作的,为什么它打印2而不是1?

4 个答案:

答案 0 :(得分:10)

因为x---1实际上只是x-- - 1,在递减x - 1之前会产生x的值。

假设x的初始值为3,则循环运行2次(一次x = 3,x = 2一次,然后下一次x为1,所以x - 1为0 ,循环不再运行了。

所以,i从0开始,它增加两次,所以它最终为2。

答案 1 :(得分:5)

(x---1) == (x-- -1)

因为编译器首先尝试选择更大的令牌,所以---被解释为--&amp; -

表达式x-- - 1表示由于1减去操作而从当前值x中减去 。由于后缀递减运算符-x递减为1。

例如,在第一次迭代--之前,因此在x = 3递减之后,在下一次迭代之前,条件为2(即3 - 1} {{1} }。

xx = 2;

  • 1次迭代: x = 3,并且循环i =0变为while(2)

i1

  • 2次迭代: x = 2,并且循环i = 1;变为while(1)

i2

  • 现在,x = 1 = i = 2;提供x - 1和循环中断,0不递增。

循环输出后while(0) i

再注意一点:i不会因为循环中断而增加,因为2在while-block i中,但i++递减为{}。如果printf x,则循环后输出为0

答案 2 :(得分:3)

因此,如果你用更多的空间来看它,那么它可能会更有意义:

while( ( x-- - 1) )

它正在使用后递减,因此在返回它的当前值后修改x,所以它实际上等同于:

while( ( x - 1) )

并且循环将一直运行,直到表达式为false,或者在此情况下0运行,等同于false。所以运行是这样的:

x   x - 1   i
=============
3     2     1    x - 1 not 0 so increment i
2     1     2    x - 1 not 0 so increment i
1     0     2    Loop exits here and does not increment i again

此时循环退出并点击printf

答案 3 :(得分:2)

while((x---1))相当于while((x-- -1 != 0)),后者与撰写while(x-- != 1)相同。由于x--的值是<{1>} 之前的值递减,因此与

相同
x

如果while(x != 1) { x--; ... } 从3开始,则会运行两次。