当分配从右到左发生时,为什么跟随不给出编译器错误?
String str = str = "";
该行为由Java 语言规范 #15.1关于赋值运算符定义。即(强调我的):
否则,需要三个步骤:
- 首先,评估左侧操作数以产生变量。如果这个求值突然完成,那么赋值表达式也会因为同样的原因而突然完成;不计算右侧操作数,也不发生赋值。
- 否则,评估右侧操作数。如果这个求值突然完成,那么赋值表达式也会因为同样的原因而突然完成并且没有赋值发生。
- 否则,将右侧操作数的值转换为左侧变量的类型,进行值集转换(第 5.1.13 节)到适当的标准值集(不是扩展指数值集),并将转换的结果存储到变量中。
所以表达式的求值str = str = "";
是从右到左的,但是左边的操作数String str
首先被求值并创建变量。
编译器会为您生成警告,Assignment to variable str has no effect
这意味着编译器只需将其替换为
String str = "";
根据Java 语言规范的第 6.3 段,允许在其自己的初始化程序中使用(局部)变量。
块中局部变量声明的范围(第 14.4 节)是声明出现的块的其余部分,从它自己的初始化程序开始,并在局部变量声明语句的右侧包括任何进一步的声明符。
在初始化之前不允许读取变量,但该语句不会这样做。
Java 允许从右到左分配对象。
下面的代码清楚地表明了这一点。
String a;
String b;
String c;
String str = a = b = c = "Hello World!";
没有什么像第二个str。
String str = str = ""; // There is only 1 str here and it is declared properly.Thus the compiler doesnt give any error.
String str = a = ""; // This will give Error Though since a is undeclared