为何这段C代码中z未被赋值为50?优先级与短路求值疑问
问题解析:为何z未被赋值为50?
先看你给出的C代码:
int x = 10, y = 20, z = 10; if (x == 10 || y == 20 && (z = 50)) printf("%d", z);
核心原因是逻辑或||的短路求值特性,优先级只是决定表达式的结合顺序,不会覆盖这个规则:
- 首先计算
x == 10,结果为真(非0)。 - 逻辑或
||的规则是:只要左侧表达式为真,整个表达式的结果就已经确定为真,右侧的表达式会被直接跳过,完全不会执行。 - 虽然
&&优先级高于||,表达式会被解析成x == 10 || (y == 20 && (z = 50)),但由于左侧的x ==10已经为真,右侧的y ==20 && (z=50)根本没机会运行,z=50这个赋值操作自然不会发生,所以z还是初始的10。
如果想让z=50执行,可以把左侧的条件改成假,或者用不具备短路特性的按位或|(注意:按位或语义和逻辑或不同,仅适用于布尔值场景)。
内容的提问来源于stack exchange,提问作者Hossam rashed
相关产品推荐
相关产品推荐

