java - Java中OR运算符的不同行为
问题描述
我在下面有一个简单的代码:
public class Foo {
public static void main(String[] args) {
boolean v = true;
v = v || hello();
System.out.println(v);
}
public static boolean hello() {
System.out.println("inside hello");
return true;
}
}
它打印:
true
但如果我改变表达:
v = v || hello();
至
v |= hello();
它打印:
inside hello
true
谁能解释为什么会这样?我假设它们应该具有相同的行为,但在|=
操作员的情况下,不会发生短路。
解决方案
15.26.2. Compound Assignment Operators
不会造成短路:
首先,评估左侧操作数以产生变量。如果这个求值突然完成,那么赋值表达式也会因为同样的原因而突然完成;不计算右侧操作数,也不发生赋值。
否则,将保存左侧操作数的值,然后计算右侧操作数。
...
推荐阅读
- javascript - 正则表达式在 Regex101 上工作,但不在网站上
- php - 即使参数正确传递,参数太少也会出错
- sql - SQL 在 SQL 查询中创建“Admin”(WHERE 子句中的 CASE/IF)
- node.js - Nodejs/Typescript 错误:SyntaxError: Unexpected token :
- haskell - 修复箭头轴(图表库)
- c# - 循环遍历多个文本框并验证坐标
- c# - 如果小数位为 .00,则需要忽略字符串中的小数位
- git - 使用 `git branch -r` 看不到推送的分支
- ms-access - MS Access 查询 - 一对多连接
- c# - 带撇号的动态 WHERE 子句“缺少关键字”