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

时间:2019-07-05 09:23:40

标签: c increment ternary-operator

此特定循环填充一个数组,该数组一点一点地代表二进制数。我想做的是使用三元运算符检查用户输入的数字是“ 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++可以使其完美运行。我的问题是,为什么它在第一种情况下不起作用,为什么 在第二种情况下起作用?

1 个答案:

答案 0 :(得分:4)

您的表情分组为

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

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

请注意,?:之间的位就像在括号中一样被分组,但是:之后的部分不是这样。换句话说,有些奇怪的是

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

表现出您所期望的方式,尽管对我而言,依靠它可能已经太遥远了。