C程序逻辑运算符序列

时间:2014-04-07 16:14:49

标签: c

为什么第二行

int i=-3, j=2, k=0, m;
m = ++i && ++j || ++k;

++j之后终止并忽略++k? 我知道前半部分为TRUE值,无论以下值是什么,都会返回TRUE。但是,停止执行以下工具的条件是什么?只要我们能确认最终价值?

4 个答案:

答案 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