#include <stdio.h>
void main()
{
int i = -3, j=2, k=0, m;
m= ++i|| ++j && ++k;
printf("%d%d%d%d", i, j, k, m);
}
如果我们在++i|| ++j && ++k;
中看到评估顺序,我们首先会对++j && ++k
进行评估,它会增加j和k的值,之后它将评估为1
++i || 1
会评估哪个会增加i的值并将1分配给m,所以输出应该是-2 3 1 1
但是它给出了输出-2 2 0 1
我想我在这里缺少一些概念。
答案 0 :(得分:4)
||
和&&
是短路运营商。如果没有必要确定输出,它们不会计算第二个操作数。
这里,++i
求值为非零值,在布尔上下文中为true
。根本没有对右侧进行评估。
答案 1 :(得分:3)
由于运算符||
和&&
已进行短路评估,因此++i
评估为true
后,++j
和++k
将不会被评估。因此,j
和k
保持不变。
答案 2 :(得分:1)
逻辑运算符始终从左到右进行评估。这些运算符称为短路运算符,即如果表达式的值可以仅从左操作数的值推导出,则不评估右操作数。由于此处i
不为零,因此永远不会评估++j && ++k
,因此不会对j
和k
进行任何修改。
运算符优先级与评估顺序无关。不要混淆。
答案 3 :(得分:0)
m将等于1,首先评估 OR 条件,并且由于++ i非零,您将得到
m=1
由于OR语句本身的第一部分是 true ,因此不评估第二部分。因此,您的j和k值将保持不变。