Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/358.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+;=带charAt()方法的字符串上的运算符会导致字符相加_Java_String_Operators_Charat - Fatal编程技术网

Java+;=带charAt()方法的字符串上的运算符会导致字符相加

Java+;=带charAt()方法的字符串上的运算符会导致字符相加,java,string,operators,charat,Java,String,Operators,Charat,我正在Codingbat.com上解决这些问题,突然发现对于+=操作符,a+=b不一定完全等于a=a+b。这是众所周知的,之前已经讨论过了,但是当使用charAt()方法并结合上面的语法时,我遇到了一些奇怪的事情,我无法理解 假设我有两个变量: String str = "The"; String result = ""; 我想把“str”中的第一个字母加两次到“result”。一种方法是: result = result + str.charAt(0) + str.charAt(0);

我正在Codingbat.com上解决这些问题,突然发现对于
+=
操作符,
a+=b
不一定完全等于
a=a+b
。这是众所周知的,之前已经讨论过了,但是当使用
charAt()
方法并结合上面的语法时,我遇到了一些奇怪的事情,我无法理解

假设我有两个变量:

String str    = "The";
String result = "";
我想把“str”中的第一个字母加两次到“result”。一种方法是:

result = result + str.charAt(0) + str.charAt(0);
这将导致
result=“TT”

但是,如果我使用
+=
运算符,例如:

result += str.charAt(0) + str.charAt(0);
我得到
result=“168”
。显然,已经添加了字符(“T”的ASCII码是84,84*2=168)

我想知道在第一种情况下使用
+=
操作符到底发生了什么。根据公式:
e1op=E2
相当于
E1=(T)((E1)op(E2))
。因此,我希望后一个表达式输出
“168”
,就像使用
+=
操作符一样。但是以下输出正确,而不是
“168”

我是不是误解了文件?我还发现一个on,这表明
str1+=str2
相当于:

str1 = new StringBuilder().append(str1).append(str2).toString();
但评估以下方面:

result = new StringBuilder().append(str.charAt(0)).append(str.charAt(0)).toString();
仍然导致
“TT”
,而不是
“168”

抱歉发了这么长的帖子!我只是好奇在将
charAt()
与字符串和
+=
组合使用时实际发生了什么,因为我发现的两个“等价物”(如果我正确地将它们从两个术语翻译成三个术语)不会产生相同的结果

result = result + str.charAt(0) + str.charAt(0);
result
是一个字符串,因此第一个
+
执行字符串串联,生成另一个字符串。第二个
+
,按照相同的逻辑,也将执行字符串连接。这就得到了期望的结果

result += str.charAt(0) + str.charAt(0);
首先计算右侧的str.charAt(0)+str.charAt(0)。现在,您添加了两个字符,其工作原理类似于简单的整数加法,即添加ASCII值。然后,我们将这个结果(在本例中是一个
int
--84)附加到
结果
,这就是您看到的结果

char c = 'T';
System.out.println(c + c);
168 这里的根本区别只是评估事物的顺序

str.charAt(0) + str.charAt(0)
在赋值
+=
发生之前,作为一个整体进行评估

charAt
返回一个
char
,其加法定义与整数类似。因此,这与:

result = result + (str.charAt(0) + str.charAt(0));

正如您在问题中所述,
E1 op=E2
相当于
E1=(T)((E1)op(E2))
。那么这条线呢

result += str.charAt(0) + str.charAt(0);
相当于

result = (String) ((result) + (str.charAt(0) + str.charAt(0)));
(注意字符添加的括号,它们很重要)

这将评估为

result = (String) (("") + ('T' + 'T'));
result = (String) (("") + (168));
result = (String) ("168");
result = "168";
而如果没有括号,你会得到

result = (String) ("" + 'T' + 'T');
result = (String) ("T" + 'T');
result = (String) ("TT");
result = "TT";

说“不要那样做”就足够了吗?如果不是的话,看看。不,我很容易超越这个问题,但我也想从中学习。谢谢你的链接!我总是忘了考虑运算符优先级。这有点像西班牙宗教法庭。没人期待西班牙宗教法庭!
result = (String) (("") + ('T' + 'T'));
result = (String) (("") + (168));
result = (String) ("168");
result = "168";
result = (String) ("" + 'T' + 'T');
result = (String) ("T" + 'T');
result = (String) ("TT");
result = "TT";