+ =运算符,带有String和强制转换的字符

时间:2019-01-14 09:47:03

标签: 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”。为什么看似无视铸造?

3 个答案:

答案 0 :(得分:5)

+=无关。与+的工作方式有关。

如果+的两个操作数均为String类型,则+是字符串连接运算符;否则,它是数字加法。


temp += (char) 90 + 10; 

相同
temp += ((char) 90 + 10);

因此首先评估括号,然后应用+=。这里,(char) 9010都不是String,因此+是数字加法。

为了进行数字加法,必须使两个操作数兼容-这称为二进制数字提升。如果操作数是charint,则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”。

    < / li>

答案 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"