为什么这个 while 循环以 -1 结束?

问题描述 投票:0回答:1

这是我学校的一个练习,我试图理解为什么 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
并且循环停止。

c
1个回答
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,循环退出。

© www.soinside.com 2019 - 2024. All rights reserved.