我在以下 C 代码中没有得到预期的输出
main(){
int i=0,j=-2,k=0,m;
if((!i||--j&&k++)&&(i++||j++&&!k++))
{
printf("i=%d j=%d k=%d",i,j,k);
}
return 0;
}
我在编译器中得到的输出为:
i=1 j=-1 k=1
但我不明白这里到底发生了什么。
我认为 if 语句不应该运行,因为它的参数是 false
注意第一个括号(!i||--j&&k++)
此处为 !i=1
因此此括号为 true,因为 OR 运算符下任何带有 1 的内容都将为 true。
输出值变为:i=0, j=-3, k=1
现在请注意第二个括号:(i++||j++&&!k++)
这里我们有 ( 0 || -3 && !1) = 0, false
由于括号之间用&&
分隔,因此if语句的整个参数变为false
。
请解释一下我的论点哪里错了。我是 C 新手
最佳答案
逻辑 AND 运算符 &&
和逻辑 OR 运算符 ||
是短路运算符,这意味着如果表达式的结果是,则不会计算右侧可以从左侧确定。
所以当这个子表达式运行时:
(!i||--j&&k++)
解析为:
(!i||(--j&&k++))
||
的左侧求值为 true,因此 --j&&k++
不求值,这意味着 j
的值仍然是 - 2,k
的值保持为 0。
所以最外面的&&
的左边是true,所以现在我们评估右边:
(i++||j++&&!k++)
解析为:
(i++||(j++&&!k++))
i
递增到 1,然后在 ||
中使用旧值。旧值 0 的计算结果为 false,因此计算右侧。 j
递增到 -1,旧值 -2 计算结果为 true,因此计算 &&
的右侧。 k
增加到 1,旧值 0 应用于 !
运算符,其计算结果为 true。这使得整个表达式为 true,并且打印该语句,此时 i 为 1,j 为 -1,k 为 1。
关于c - 使用逻辑运算符和前/后增量无法从此代码中获得预期输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57795317/