1

当分配从右到左发生时,为什么跟随不给出编译器错误?

String str = str = "";
4

4 回答 4

2

该行为由Java 语言规范 #15.1关于赋值运算符定义。即(强调我的):

否则,需要三个步骤:

  • 首先,评估左侧操作数以产生变量。如果这个求值突然完成,那么赋值表达式也会因为同样的原因而突然完成;不计算右侧操作数,也不发生赋值。
  • 否则,评估右侧操作数。如果这个求值突然完成,那么赋值表达式也会因为同样的原因而突然完成并且没有赋值发生。
  • 否则,将右侧操作数的值转换为左侧变量的类型,进行值集转换(第 5.1.13 节)到适当的标准值集(不是扩展指数值集),并将转换的结果存储到变量中。

所以表达式的求值str = str = "";是从右到左的,但是左边的操作数String str首先被求值并创建变量。

于 2012-08-17T11:39:38.123 回答
0

编译器会为您生成警告,Assignment to variable str has no effect这意味着编译器只需将其替换为

  String str = "";
于 2012-08-17T11:34:53.003 回答
0

根据Java 语言规范的第 6.3 段,允许在其自己的初始化程序中使用(局部)变量。

块中局部变量声明的范围(第 14.4 节)是声明出现的块的其余部分,从它自己的初始化程序开始,并在局部变量声明语句的右侧包括任何进一步的声明符。

在初始化之前不允许读取变量,但该语句不会这样做。

于 2012-08-17T12:01:17.880 回答
0

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
于 2012-08-17T11:28:13.193 回答