【发布时间】:2013-01-18 06:43:14
【问题描述】:
我一直认为使用条件布尔运算符(也称为短路)代替常规布尔运算符不会影响表达式的结果。
var result = true | false & false;
结果与
相同var result = true || false && false
两个表达式的结果都是true。
但是,如果我将常规运算符和条件运算符混合使用会怎样?
var result1 = true || false & false;
var result2 = true | false && false;
你会期待什么?我希望这些仍然会返回true。但事实并非如此。结果 2 将是 false!
我知道这是因为operator precedence。优先顺序为& | && ||。这对我来说似乎违反直觉。我希望订单为& && | ||,在这种情况下,所有结果都是相同的(我认为)。
所以我想我真正的问题不是 如果 短路可以改变结果。问题是为什么优先顺序是这样的,短路可以改变结果。
【问题讨论】:
-
短路肯定会改变副作用(即如果布尔表达式是方法),因此进行区分是有意义的。
-
@Antonijn:你的意思是它可以改变副作用吗?
-
对不起,我应该更清楚的。
-
答案很无聊,因为它继承了 C 的优先级和关联性规则,就像所有花括号语言一样。通过扮演语言设计者的角色来让它变得有趣,并提出一个替代方案。您只有几个选择,优先级可以相反或相等。如果相等,则关联性很重要,可能是您忽略的。
标签: c# boolean-logic short-circuiting