为什么增量在这种情况下不起作用?

Why does the increment not work in this case?

这个特定的循环逐位填充一个代表二进制数的数组。我要做的是使用三元运算符检查用户输入的数字是“0”还是“1”。

while (i < 8)
{
    printf("Bit %d: ", i);
    scanf("%d", &binaryNumber[i]);
    ((binaryNumber[i] == 1) || (binaryNumber[i] == 0)) ? i++ : printf("Binary bits can only be 0 or 1!\n"), i--;
}

此代码无法递增 i;所以它无限循环并且printf("Bit %d: ", i)总是导致Bit 0: 隐藏在:角落的小i--是为了重新访问之前的元素,并用正确的值覆盖它。

然而,在三元下添加i++使其完美运行。我的问题是,为什么它在第一种情况下不起作用,为什么 它在第二种情况下起作用?

您的表达被归类为

(
    binaryNumber[i] == 1 || binaryNumber[i] == 0 
    ? i++ 
    : printf("Binary bits can only be 0 or 1!\n")
), i--;

并使用定义的行为进行编译,因为 printf returns 一个 int 类型并且 , 是一个排序点。换句话说,i 总是 递减。

请注意,?: 之间的位被分组为好像在括号中一样,但 : 之后的部分并非如此。换句话说,有些奇怪的是,表达式

!(binaryNumber[i] == 1 || binaryNumber[i] == 0) 
? printf("Binary bits can only be 0 or 1!\n"), i--
: i++

以您期望的方式行事,尽管依赖它可能有点过头了,即使对我来说也是如此。