我最近遇到了这种语法
int i;
String s = "test";
if(!((i=s.length()) == 0)) {
System.out.println(i);
}
如果您想知道它打印的是什么,请打印:
4
现在我知道这段代码可以正确编译。我也明白这会将s.length的值放入i中。我想知道这怎么可能? 我们如何在if子句中等同/赋值变量。是否有人有任何见解,不知道如何使用编译器
答案 0 :(得分:6)
作业表达
i=s.length()
解析为分配的值。
在运行时,赋值表达式的结果是值 分配发生后的变量。结果 赋值表达式本身不是变量。
我现在不想去获取字节代码,但基本上是
s
的值被推入堆栈String#length()
i
答案 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周围的括号,我确定您会收到语法错误。长度()。