【发布时间】:2016-07-27 08:40:30
【问题描述】:
所以我在去年的 Comp Sci 期中考试中遇到了这个问题,但我仍然无法弄清楚为什么 a&&b 和 b&&a 不会得出相同的结果
在我看来,有 4 种可能的情况:
- A 为真,B 为真:
- 真 && 真就是真
- A 为真,B 为假:
- True && False 是 False 和 False && True 也是 False
- A 为假,B 为真:
- 假 && 真为假,真 && 假为假
- A 为 FALSE,B 为 FALSE:
- 假 && 假就是假
然而,期中的修正和教授说 a&&b 和 b&&a 并不总是评估到相同的结果。
编辑:我看不出这是“运算符短路”的重复...我绝不会问关于 AND 操作的第一部分的问题...我问的是两个部分并且与此重复的“原始”问题无法回答我的问题。
【问题讨论】:
-
取决于
a和b将代表什么。a或b可能会修改另一个表达式的状态 -
如果 a 和 b 是变量,那么当然 a&&b 和 b&&a 给出相同的结果。但如果这些实际上是方法调用,情况就不同了(因为副作用)。
-
首先,我不明白为什么 OldCurmudgeon 将此问题标记为“操作员短路”的重复...? ... 其次,非常感谢 GhostCat,我应该有方法调用,但如果我错了,请纠正我,但这是否意味着,例如,如果有人调用方法 a 并且该方法修改了 b 的输出而不是反过来,那么 a&&b 和 b&&a 确实不会评估到相同的结果?
-
@SilenT612 想象两个变量
a和b,都设置为false,以及两个方法a1和b1。a1将简单地返回a。b1将设置a和b为true并返回b。事实上a1&&b1现在是false,因为a1将返回a的当前状态,即false。但是b1&&a1会将a修改为true并将b修改为true,这将导致整体true声明。 -
@SilenT612 运算符短路在这里是相关的,因为这是两个语句可能不同的原因之一。当使用 a && b 时,表达式从左到右计算。如果 a 的计算结果为 false,则 b 不会被计算,因为 Java VM 已经知道表达式将为 false。但是,如果 a 评估为 true,则 b 也将被评估。因此 a && b 有时用作写作的简写: if(a) { b; }。因此很明显,当 a 和/或 b 不是简单的布尔常量或变量时,a 和 b 的顺序实际上很重要。
标签: java boolean logical-operators