为什么instanceof和addition以错误的顺序执行?

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执行的是:

  1. 字符串连接"Result is: " + x得到字符串"Result is: null,然后
  2. 检查该字符串是否与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)

可以说也更具可读性。

一般而言,永远不要依赖运算符优先级规则(除非*+数学上下文中),否则只会让读者感到困惑。