Adi*_*tel 0 java operator-precedence
当我简单地写代码时
String x = null;
System.out.println(x instanceof Object);
Run Code Online (Sandbox Code Playgroud)
输出为false,正如预期的那样。
但当我尝试将其写得略有不同时,即:
public class Main {
public static void main(String[] args) {
String x = null;
System.out.println("Result is: " + x instanceof Object);
}
}
Run Code Online (Sandbox Code Playgroud)
我得到true作为输出。为什么?
x instanced Object应该还是false这样吧?我想得到像这样的输出
Result is: false
Run Code Online (Sandbox Code Playgroud)
Zab*_*uza 10
true?Java 以与您预期不同的顺序评估您的代码。当你写的时候
System.out.println("Result is: " + x instanceof Object);
Run Code Online (Sandbox Code Playgroud)
Java执行的是:
"Result is: " + x得到字符串"Result is: null,然后instanceof Object,所以"Result is: null" instanceof Object这显然是true。即它执行它就像你会像这样加上括号:
System.out.println(("Result is: " + x) instanceof Object);
Run Code Online (Sandbox Code Playgroud)
这是由于 Java 中的运算符优先级规则所致,您可以在此处阅读更多相关内容:运算符
您可以看到加法+结合比 更强instanceof:
为了获得预期的输出,您必须使用括号明确顺序,如下所示:
System.out.println("Result is: " + (x instanceof Object));
// Result is: false
Run Code Online (Sandbox Code Playgroud)
或者,使用一些变量将表达式拆分为多个:
boolean isObject = x instanceof Object;
System.out.println("Result is: " + isObject);
Run Code Online (Sandbox Code Playgroud)
可以说也更具可读性。
一般而言,永远不要依赖运算符优先级规则(除非*在+数学上下文中),否则只会让读者感到困惑。