Java+;=带charAt()方法的字符串上的运算符会导致字符相加
我正在Codingbat.com上解决这些问题,突然发现对于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);
+=
操作符,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";