我在C中有以下代码源:
#include<stdio.h>
void main()
{
int i=0, x=3;
while((x---1))
{
i++;
}
printf("%d", i);
}
这个while语句是如何工作的,为什么它打印2而不是1?
答案 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
中减去1> 。由于后缀递减运算符-
,x
值递减为1。
例如,在第一次迭代--
之前,因此在x = 3
递减之后,在下一次迭代之前,条件为2
(即3 - 1
} {{1} }。
x
,x = 2
;
x = 3
,并且循环i =0
变为while(2)
i
,1
x = 2
,并且循环i = 1;
变为while(1)
i
,2
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开始,则会运行两次。