逻辑OR与三元运算符求值顺序:代码执行结果疑问解析
嘿,这个问题刚好戳中了运算符优先级和结合性的常见误区,我来给你掰扯明白!
首先得纠正一个核心误解:在C#里,逻辑OR(||)的优先级确实高于条件运算符(?:),但这和你预期的求值顺序完全相反——你以为会是true || (false ? false : true),但实际编译器会把表达式解析成(true || false) ? false : true,这才是优先级规则的正确应用方式。
为什么是这样?
优先级的本质是:优先级高的运算符会先绑定自己的左右操作数。因为||比?:优先级高,所以它会先把true和false这两个操作数结合成一个整体,再把这个整体作为三元运算符的条件部分,而不是让三元运算符先处理后面的false ? false : true。
再拆解你的示例代码
咱们一步步看执行逻辑:
- 先处理
true || false:因为逻辑OR是短路求值,只要第一个操作数是true,后面的false根本不会被执行——这就是为什么你看到这个false被标记为不可达。 - 这个部分的结果是
true,所以三元表达式变成了true ? false : true。此时,三元运算符的: true分支永远不会被触发(因为条件永远是true),所以这个true也被标记为不可达。 - 三元表达式的最终结果是
false,所以if的条件永远不满足,里面的Console.WriteLine自然永远不会执行。
怎么得到你预期的行为?
如果你想让三元运算符先求值,只需要手动加括号强制改变结合顺序:
if ( true || (false ? false : true) ) { Console.WriteLine(String.Format("WHY?")); }
此时表达式会先计算false ? false : true得到true,再和前面的true做OR运算,结果是true,if条件就会满足了。
内容的提问来源于stack exchange,提问作者Виталий Камалин
相关产品推荐
相关产品推荐

