复合逻辑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
条件始终为真,因此不会评估 ++k
,因为 &&
是一个捷径然后但 ||
是一个捷径否则 (所以他们可能不会评估他们的正确操作数)。
因此 &&
的计算如下:计算左操作数,如果为假则返回,然后只有当它为真时(即不等于 0
)计算右操作数并作为计算结果返回&&
。同样,||
的计算如下:左操作数被计算。如果为真(非零),则成为 ||
的结果;否则右操作数被评估并且是 ||
表达式的结果。
特别是,当编码 if (x > 0 && 20/x < 5)
时,永远不会尝试对 x==0
进行除法。
另请阅读维基百科 operators in C & C++ & short circuit evaluation & lazy evaluation 页面;请花几个小时阅读一本优秀的 C 编程书籍。