Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java +;=带字符串和casted char的运算符_Java_String_Casting_Char - Fatal编程技术网

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')应该为真,因为二进制数字提升,对吗?