Java +;=带字符串和casted char的运算符
这可能是一个愚蠢的问题,但我发现了一个我无法理解的互动。我认为这与+=的工作方式有关Java +;=带字符串和casted char的运算符,java,string,casting,char,Java,String,Casting,Char,这可能是一个愚蠢的问题,但我发现了一个我无法理解的互动。我认为这与+=的工作方式有关 String temp = ""; temp += (char) 90 + 10; System.out.println(temp); // "100" temp = "" + (char) 90 + 10; System.out.println(temp); // "Z10" Z10是有意义的。100没有。我认为第二行将以两种不同的方式之一执行,以生成“Z10”或“d”。为什么这个角色似乎被忽略了?它与+=
String temp = "";
temp += (char) 90 + 10;
System.out.println(temp); // "100"
temp = "" + (char) 90 + 10;
System.out.println(temp); // "Z10"
Z10是有意义的。100没有。我认为第二行将以两种不同的方式之一执行,以生成“Z10”或“d”。为什么这个角色似乎被忽略了?它与
+=
无关。这与+
的工作方式有关
如果+
的任一操作数为字符串类型,+
为字符串串联运算符;否则,它是数字加法
与
temp += ((char) 90 + 10);
temp += (("" + (char) 90) + 10);
因此首先计算括号,然后应用+=
。这里,(char)90
和10
都不是字符串,因此+
是数字加法
为了进行数字加法,两个操作数必须兼容-这称为二进制数字提升。如果操作数是char
和int
,则char
将加宽为int
因此,(char)90
立即扩大到90
;然后可以添加两个int
s,产生100
,然后可以通过+=
将其附加到temp
字符串中
另一方面
temp += "" + (char) 90 + 10;
与
temp += ((char) 90 + 10);
temp += (("" + (char) 90) + 10);
因此,它首先计算最里面的括号
因为“
是一个字符串,所以”+(char)90
是字符串串联,导致值“Z”
。那也是一个字符串
;因此“Z”+10
也是字符串串联,导致“Z10”
赋值运算符,如+=
具有相同的属性,因此+=
在+
之后求值
因此,在对+=
运算符求值之前,将对其2个操作数求值。第一个操作数是temp
,第二个操作数是(char)90+10
(char)90+10
计算为100
(两个数字操作数,因此+
执行加法)。因此,100
被连接到由temp
引用的空字符串
,从而产生字符串
“100”
另一方面,在
temp = "" + (char) 90 + 10;
有两个+
运算符。两者具有相同的优先级,因此从左到右求值
- 首先,
“+(char)90
执行字符串
和字符
的串联,产生一个字符串
,其单个字符是与值90(“Z”)匹配的字符
- 然后,第二个
+
将int
10连接到字符串
“Z”,得到字符串
“Z10”
类型转换的优先级高于算术运算符
(char)90+10
评估为((char)90)+(10)
。将char
添加到int
的结果是int
您需要的是(char)(90+10)
,即将添加的结果强制转换为char
。然后它将作为字符
附加到字符串中:
String temp = "";
temp += (char) (90 + 10);
System.out.println(temp); // prints "d"
好的,谢谢。所以你提到的二进制数字提升就像是用一个整数表达式初始化一个double,对吗?这只是一种特殊情况,+运算符也会根据所使用的数据类型进行更改。但这是同一种想法:编译器应用自动转换,使值与特定上下文兼容。谢谢——最后一个问题。如果我理解正确,intfoo=100;字符串bar=“d”;foo==bar.charAt(0)
(100的unicode是'd')应该为真,因为二进制数字提升,对吗?