复合逻辑 AND/OR 表达式中的各个表达式不是应该在逻辑运算符应用于其结果之前先进行计算吗?为什么是 ++k
完好无损m = ++i && ++j || ++k
对于以下程序:
#include<stdio.h>
int main()
{
int i=-3, j=2, k=0, m;
m = ++i && ++j || ++k;
printf("%d, %d, %d, %d\n", i, j, k, m);
return 0;
}
输出: -2,3,0,1
但我期望输出 -2,3,1,1
最佳答案
您应该避免编写此类不可读的代码。它实际上被解析为
m = (++i && ++j) || ++k;
因此,一旦 j >= 0
,++j
条件始终为 true,因此不会评估 ++k
,因为 &&
是一个快捷方式 然后,但 ||
是一个快捷方式 or else (因此他们可能不会评估正确的操作数)。
因此 &&
的计算如下:计算左操作数,如果为 false 则返回,然后仅当为 true(即不等于 0
)时计算右操作数并作为计算结果返回&&
。同样,||
的计算如下:计算左操作数。如果为真(非零),它将成为 ||
的结果;否则右操作数被计算并且是 ||
表达式的结果。
特别是,在编码 if (x > 0 && 20/x < 5)
时,永远不会尝试对 x==0
进行除法。
另请阅读维基百科 operators in C & C++ & short circuit evaluation & lazy evaluation 页面;请花几个小时阅读一本好的 C 编程书籍。
关于c - 为什么当 "k"计算结果为 true 时,语句 "m =++i &&++j ||++k"中的 "++i&&++j"不增加?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16271779/