这是我学校的一个练习,我试图理解为什么 while 循环在
-1
结束。
#include <stdio.h>
int main()
{
int a = 0xfe - 067;
while (a > 9 ? !!!0 : !!(a + 1, a -= 2, --a))
{
printf("%d \n", a);
if (a + 2 > 0x11) //(17)
{
a = -3;
continue;
}
a += 4;
}
return 0;
}
我知道这不是一个现实的例子,但我的学校在考试中加入了这个练习。我看到当
a=-1
处于最高值时 a+=4
将 a
设置为 3
并且循环停止。
在最后一次循环迭代中,a 为 3。
while (a>9 ? !!!0:!!( a+1,a-=2,--a))
a>9
为假,因此使用三元表达式的右侧:
!!( a+1,a-=2,--a)
首先计算括号内的表达式:
a+1,a-=2,--a
当有多个用逗号分隔的表达式时,每个表达式按从左到右的顺序计算。然后,除了最右边的表达式之外,每个表达式的值都将被丢弃。
因此表达式按以下顺序求值:
a+1
为 4。该值被丢弃。 a
仍然是3.
a-=2
为 1。该值被丢弃。然而 -=
运算符确实修改了 a 的值,因此 a 现在是 1。
--a
为 0。这是最右边的表达式,因此保留其值。
然后将 !!
应用于 0。第一个 !
将 0 翻转为 1,然后第二个 !
将 1 翻转回 0。
所以最终值为0,循环退出。