这可能是一个愚蠢的问题,但是我发现我无法理解的互动。我认为这与+ =的工作方式有关。
String temp = "";
temp += (char) 90 + 10;
System.out.println(temp); // "100"
temp = "" + (char) 90 + 10;
System.out.println(temp); // "Z10"
Z10很有意义。 100没有。我认为第二行将以两种不同的方式之一执行以产生“ Z10”或“ d”。为什么看似无视铸造?
答案 0 :(得分:5)
与+=
无关。与+
的工作方式有关。
如果+
的两个操作数均为String
类型,则+
是字符串连接运算符;否则,它是数字加法。
temp += (char) 90 + 10;
与
相同temp += ((char) 90 + 10);
因此首先评估括号,然后应用+=
。这里,(char) 90
和10
都不是String
,因此+
是数字加法。
为了进行数字加法,必须使两个操作数兼容-这称为二进制数字提升。如果操作数是char
和int
,则char
会扩展为int
。
因此(char) 90
会立即变回90
;然后可以添加两个int
-产生100
-然后可以通过temp
将其附加到+=
字符串中。
另一方面
temp += "" + (char) 90 + 10;
与
相同temp += (("" + (char) 90) + 10);
因此,它首先评估最内层的括号。
因为""
是String
,所以"" + (char) 90
是字符串连接,结果是值"Z"
。那也是String
;因此"Z" + 10
也是字符串连接,结果是"Z10"
。
答案 1 :(得分:2)
诸如+=
之类的赋值运算符具有lowest precedence,因此+=
在+
之后求值。
因此,在评估+=
运算符之前,先评估其2个操作数。第一个操作数为temp
,第二个操作数为(char) 90 + 10
。 (char) 90 + 10
的值为100
(两个数字操作数,因此+
执行加法运算)。因此,100
被连接到String
引用的空temp
上,从而得到String
“ 100”。
另一方面,在
temp = "" + (char) 90 + 10;
有两个+
运算符。两者的优先级相同,因此从左到右进行评估。
第一个"" + (char) 90
执行一个String
和一个char
的串联,生成一个String
,其单个字符是与值90匹配的字符(“ Z ”)。
然后,第二个+
将int
10连接到String
“ Z”,得到String
“ Z10”。
答案 2 :(得分:1)
类型转换的优先级高于算术运算符。
(char) 90 + 10
被评估为((char) 90) + (10)
。将char
添加到int
的结果是int
。
您想要的是(char) (90 + 10)
,即将添加的结果投射到char
中。然后将其作为String
附加到char
:
String temp = "";
temp += (char) (90 + 10);
System.out.println(temp); // prints "d"