Unwind、R 和其他人已经解释了真正发生的事情。所以让我补充一下:
你问题的前提是错误的。 && 具有较高优先级这一事实并不意味着围绕它的操作数必须在表达式中具有较低优先级的任何操作数之前计算。即使|| 和&& 的特殊情况短路也不一定如此。
例如,考虑a=b+c+d*e; * 的优先级高于 +,但这并不意味着必须在 b+c 之前评估 d*e。它只是意味着在我们将乘积作为一个整体添加到表达式之前必须对其进行评估。编译器可以将此表达式评估为temp1=d*e、temp2=b+c、a=temp1+temp2,或者它可以评估temp1=b+c、temp2=d*e、a=temp1+temp2。两者都同样有效。
由于|| 和&& 的短路行为,对评估顺序施加了一些额外的限制。
附带说明:通常我会避免编写这样的代码。我可以很容易地看到另一个试图阅读这段代码的程序员对增量何时会发生以及何时不会发生感到困惑。好吧,也许如果你使用真正的变量名,它看起来就不会那么奇怪了。
我偶尔会依靠短路来防止副作用。喜欢
if (!eof() && readNextInt()>0)
如果我们已经在文件末尾,我依靠短路来防止读取,或者
if (confirmDelete==YES && deleteEntry()!=-1)
我依靠第一个测试来短路 false,所以我不应该在不应该的时候进行删除。但是这些例子对我来说似乎很简单,我希望任何有能力的程序员都会看到我在做什么。但是当这些例子变得神秘时,我认为它需要被打破。考虑
if (customerType==RETAIL || lastDepositAmount()>100.00)
如果lastDepositAmount() 有副作用,那么如果customerType 是零售的,则这种副作用永远不会发生。我认为这对读者来说不一定是显而易见的。 (部分是因为函数名称暗示它正在检索数据而不执行任何更新,部分是因为客户类型和存款金额之间没有明显的关系——这听起来像是两个独立的东西。)不可否认,这是主观。但是,如果有疑问,请选择简单明了而不是微不足道的性能改进。始终选择简单和清晰,而不是 “嘿,这是使用晦涩的功能的一种很酷的方式,任何阅读本文的人都会对我必须多么聪明才能理解该语言才能做到这一点印象深刻”。