O / p出现为x = 2,y = 1,z = 1,这与运算符优先级不一致。我在Turbo c ++编译器上运行它:
void main()
{
int x,y,z,q;
x=y=z=1;
q=++x || ++y && ++z;
printf("x=%d y=%d z=%d",x,y,z);
}
答案 0 :(得分:8)
实际上结果完全符合标准C.逻辑或运算符(||
)在++x
之后短路,因为它计算为非零数字,因此其余部分被忽略
从x=1
,y=1
,z=1
开始,在短路后,您会获得x=2
,y=1
,z=1
。< / p>
答案 1 :(得分:5)
x=y=z=1;
使所有变量= 1
q=++x || ++y && ++z;
由于++x
使其= 2且因为它不为零,所以它会停止检查其他条件,因为第一个条件是true
。
因此,x=2
和y and z = 1
答案 2 :(得分:2)
运算符优先级不以任何方式确定运算符的执行顺序。运算符优先级仅定义运算符及其操作数之间的分组。在您的情况下,运算符优先级表示表达式
q = ++x || ++y && ++z
分组为
q = ((++x) || ((++y) && (++z)))
其余的与运营商优先权完全无关。
其余部分由每个特定运算符的语义决定。在这种情况下,顶级运算符是||
。 ||
运算符的特定属性是它始终首先计算其左侧。如果左手大小变为非零,那么它甚至不会尝试评估右侧。
这正是你的情况。左侧是++x
,它的计算结果为非零值。这意味着您使用给定初始值的整个表达式在功能上等同于仅仅
q = (++x != 0)
||
操作员的右侧甚至没有触及。
答案 3 :(得分:0)
逻辑&&
(AND
)和||
(OR
)运营商受短路影响。
“逻辑运算符保证从左到右评估它们的操作数。但是,它们会评估确定表达式结果所需的最小操作数。这称为”短路“评估。”
因此,对于逻辑运算符,始终从左到右评估为(无论||
或&&
)。
如前所述,此处的优先顺序仅决定谁选谁。
然后从左到右规则;
q = ++x || ++y && ++z;
//ok, lets play by rule, lets see who takes who:
//first pass ++ is badass here (has highest precedence)
//q = (++x) || (++y) && (++z)
//second pass &&'s turn
//q = (++x) || ((++y) && (++z))
//done, let's do left to right evaluation
q = (++x) || rest..
q = (true)|| whatever..
希望有助于更清楚。