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

时间:2014-10-02 00:22:11

标签: java if-statement assign

我最近遇到了这种语法

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

如果您想知道它打印的是什么,请打印:

4

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

5 个答案:

答案 0 :(得分:6)

作业表达

i=s.length()

解析为分配的值。

From the JLS

  

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

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

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

答案 1 :(得分:2)

要理解这一点,让我们试着剖析一下,声明中的陈述

if(!((i=s.length()) == 0))
s.length() //results to 4;
i=s.length() //assigned i=4
i=s.length() == 0 //false
!i=s.length() == 0 //invert, becomes true
if(true) {
    //prints i
}

答案 2 :(得分:1)

赋值运算符是一个普通的表达式 像任何其他表达式一样,您可以将它放在任何您想要的位置。

此表达式的值是指定的值。 (这也是你可以写a = b = c

的原因

答案 3 :(得分:1)

Java赋值的结果是赋值,即

(!((i=s.length()) == 0)) 

s.length()分配给i,然后检查该值(s.length())是否为0

答案 4 :(得分:1)

Java编译器在堆栈解析器的操作上运行,每个行从左到右进行求值。每当遇到右括号时,前一个语句回到最后一个左括号将在其他任何内容之前执行...

最里面的括号将在其他任何东西之前进行评估(当然是i = s.length())。

我现在不在我的主电脑上,所以我无法对此进行测试,但如果您删除i = s周围的括号,我确定您会收到语法错误。长度()。