我正在解决Codingbat.com上的问题,并且碰到了+=
运算符,a += b
不一定与a = a + b
完全相等的事实。这是众所周知的,之前已经在SO上进行了讨论,但是当我使用charAt()
方法结合我无法理解的上述语法时,我发生了一些奇怪的事情。
说我有两个变量:
String str = "The";
String result = "";
我想将“str”中的第一个字母添加两次到“结果”。一种方法是:
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)。
我想知道在第一种情况下使用+=
运算符实际发生了什么。根据{{3}}:E1 op= E2
相当于E1 = (T)((E1) op (E2))
。所以我希望后一个表达式输出"168"
就像使用+=
运算符一样。但以下输出"TT"
正确,而不是"168"
:
result = (String)(result + str.charAt(0) + str.charAt(0));
我是否误解了文档?我还在SO上发现docs on assignment operators表明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()
与字符串和+=
结合使用时发生的事情感到好奇,因为我发现了两个“等价物”(如果我将它们从两个翻译成三个正确的术语)不会产生相同的结果。
答案 0 :(得分:7)
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)附加到result
,这就是您所看到的。
char c = 'T';
System.out.println(c + c);
168
这里的潜在差异只是评估事物的顺序。
答案 1 :(得分:5)
正如您在问题中所述E1 op= E2
相当于E1 = (T)((E1) op (E2))
。这一行
result += str.charAt(0) + str.charAt(0);
相当于
result = (String) ((result) + (str.charAt(0) + str.charAt(0)));
(注意添加char的括号,它们很重要)
这将评估为
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";
答案 2 :(得分:2)
str.charAt(0) + str.charAt(0)
在作业+=
发生之前作为一个整体进行评估。
charAt
返回char
,其中的加法定义为整数。因此,这与:
result = result + (str.charAt(0) + str.charAt(0));