为什么第二行
int i=-3, j=2, k=0, m;
m = ++i && ++j || ++k;
在++j
之后终止并忽略++k
?
我知道前半部分为TRUE值,无论以下值是什么,都会返回TRUE。但是,停止执行以下工具的条件是什么?只要我们能确认最终价值?
答案 0 :(得分:1)
条件就是这样。在C中的OR中,只要发现结果为真,其余表达式都不会被评估。
如果你想测试true或false并且还要确保所涉及的变量增加,你应该在之前增加变量然后测试:
++i;
++j;
++k;
m = i && j || k;
答案 1 :(得分:1)
如果第一个操作数的计算结果为TRUE,则||
运算符不会计算第二个操作数。
如果第一个操作数计算为FALSE,则&&
运算符不会计算第二个操作数。
答案 2 :(得分:1)
&&
的优先级高于||
的优先级。 ++i
和++j
绑定它并
m = ++i && ++j || ++k;
被解析为
m = (++i && ++j) || ++k;
由于子表达式++i
和++j
都不为零,因此它被解释为true
。由于逻辑运算符的短路行为,如果||
左侧变为true
,则不会评估第二(右)子表达式。{
1}}
请注意,||
的左子表达式为(++i && ++j)
,而不是j++
。
答案 3 :(得分:0)
逻辑AND和逻辑OR表达式的操作数从左到右进行计算。如果第一个操作数的值足以确定操作的结果,则不评估第二个操作数。这被称为"短路评估。"在第一个操作数之后有一个序列点。有关详细信息,请参阅序列点。
获得您想要的答案:here