C语言中如何结合运算符优先级表计算含短路的表达式值
问题1解答
你的核心错误是混淆了运算符优先级和表达式求值顺序这两个完全独立的概念:
- 运算符优先级的作用只是决定表达式的分组结构,这里
++优先级高于||,只会让表达式被解析为x || (++y),避免出现(x || ++) y这类不合法的语法结构,完全不代表优先级更高的子表达式就一定会先被求值。 - C标准明确规定,逻辑或
||、逻辑与&&、三目运算符?:、逗号运算符,这四类运算符严格遵循从左到右的求值顺序,且前三者自带短路规则:逻辑或的左操作数求值为非0(真值)时,直接跳过右操作数的所有求值步骤,不管右操作数内部的运算符优先级有多高,都不会执行。
这里x先求值为2(非0),直接触发短路,++y自然不会被执行。
问题2解答
C标准明确规定逻辑或||、逻辑与&&的返回值是int类型的布尔值,只会返回1(代表真)或者0(代表假),不会返回操作数本身的数值:
只要逻辑或的任意一个操作数判定为真,整个表达式的返回值就是1,和为真的操作数本身的数值无关。这里x为2属于真值,所以整个x || ++y表达式的结果是1,赋值给z后z的值就是1。
内容的提问来源于stack exchange,提问作者Mayukh Sarkar
相关产品推荐
相关产品推荐

