编译器理解 - 在if语句中赋值

Sta*_*wed 2 java if-statement assign

我最近遇到了这种语法

int i;
String s = "test";
if(!((i=s.length()) == 0)) {
    System.out.println(i);
}
Run Code Online (Sandbox Code Playgroud)

如果你想知道它打印什么打印:

4
Run Code Online (Sandbox Code Playgroud)

现在我知道这个代码编译以及正确运行.我也明白这会将s.length的值放入i中.我想知道这怎么可能?我们如何在if子句中等同/赋值变量.是否有人有任何见解,不知道如何使用编译器

Sot*_*lis 6

赋值表达式

i=s.length()
Run Code Online (Sandbox Code Playgroud)

解析为分配的值.

来自JLS

在运行时,赋值表达式的结果是赋值发生后变量的值.赋值表达式的结果本身不是变量.

我现在不想去获取字节码,但基本上

  1. of的s值被推入堆栈
  2. 该值被弹出并取消引用以调用 String#length()
  3. 结果被推到堆栈上
  4. 同样的结果再次被推到堆栈上
  5. 该值从堆栈中弹出并存储在其中 i
  6. 0的值(可能不是因为可能存在用于与0比较的字节代码指令)被推入堆栈
  7. 值和0都从堆栈弹出并与跳转指令进行比较,具体取决于结果