2012-08-17 42 views
1

当分配从右到左发生时,为什么以下不会给编译器错误?java中的变量初始化和声明问题

String str = str = ""; 
+0

它为我编译 – 2012-08-17 11:22:34

+0

你为什么认为应该给错误? – roni 2012-08-17 11:29:07

+0

@ roni:原因我认为str(第二个)尚未被声明或初始化。我们一定有什么问题。我想知道那是什么? – namalfernandolk 2012-08-17 11:37:35

回答

2

行为是由Java Lanaguage Specification #15.1有关赋值运算符定义取代它。即(重点煤矿):

否则,需要三个步骤:

  • 首先,左边的操作数进行评估,以产生可变的。如果此评估突然完成,则由于同样的原因,分配表达式会突然完成;右侧的操作数不会被评估,也不会进行分配。
  • 否则,评估右侧操作数。如果此评估突然完成,则由于同样的原因,分配表达式会突然完成,并且不会进行分配。
  • 否则,将右侧操作数的值转换为左侧变量的类型,将值集转换(第5.1.13节)转换为相应的标准值集(而不是扩展指数值设置),并将转换结果存储到变量中。

所以表达式str = str = "";的评价是由右至左,但左边的操作数String str第一个被评估,并创建变量。

+0

只是为了建立这个...首先创建str的变量引用(String str),然后评估下一个部分 - str = str将str的现有引用传递给str。然后在第三部分中创建一个新的String对象(“”等同于新的String()),然后将其分配给str的引用。所以这是一个完全有效的方案 - 虽然是多余的。 – Dan 2012-08-17 12:09:03

0

Java允许从右向左分配对象。

以下代码清楚地显示了这一点。

String a; 
String b; 
String c; 
String str = a = b = c = "Hello World!"; 

没有什么像第二个字符串。

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 
+0

在这之前你已经宣布了a,b,c之前,你不是吗? – namalfernandolk 2012-08-17 11:39:42

+0

当然是。我们应该声明变量。 JAVA只支持这种方式的分配。 – Byter 2012-08-17 11:53:22

+0

@ Byter:是Byter。但在我的例子中,看起来第二个str还没有被宣布,并且你将要“”到第二个str,它现在还没有被声明。告诉我什么是我的错。为什么? – namalfernandolk 2012-08-17 12:01:25

0

编译器为您生成Assignment to variable str has no effect一个警告,这意味着编译器简单地

String str = ""; 
0

根据paragraph 6.3 of Java Language specification,允许在其自己的初始值设定项中使用(局部)变量。

局部变量声明的块中的范围(§14.4)是 其余在其中出现的声明的块,开始 其自己初始化和包括任何进一步说明符到 右边的在局部变量声明语句中。

在初始化之前不允许读取变量,但该语句不会执行该操作。