Java中使用charAt()方法的字符串+=运算符会导致字符相加。

5
我是一名有用的助手,可以为您翻译文本。
我正在解决Codingbat.com上的问题,并发现对于 += 运算符, a + = b 不一定完全等于 a = a + b 。这是众所周知的,并且之前已经在SO上讨论过,但是当我使用 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)。
我想知道在第一个使用+=运算符的情况下实际发生了什么。根据赋值运算符文档E1 op= E2等同于E1 = (T)((E1) op (E2))。因此,我期望后面的表达式像使用+=运算符一样输出"168"。但是以下代码正确地输出"TT",而不是"168"
result = (String)(result + str.charAt(0) + str.charAt(0));

我是不是误解了文档?我在SO上也找到了一个答案,它表明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()结合使用时实际发生了什么,因为我找到的这两个“等价”的表达式(如果我正确地将它们从二转换为三个术语)并不产生相同的结果。

1
仅仅说“别那样做”够了吗?如果不够,请查看 运算符优先级 - Hot Licks
不,我可以轻松地解决这个问题,但我也想从中学习。谢谢你提供的链接!我总是忘记考虑运算符优先级。 - jodles
这有点像西班牙宗教裁判所。 - Hot Licks
没有人会预料到西班牙宗教裁判所! - jodles
3个回答

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);
这里的本质区别只是评估事物的顺序不同。

6

正如您在问题中所述,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";

2
str.charAt(0) + str.charAt(0)

在执行赋值操作 += 之前,整个表达式会被计算。

charAt 返回一个 char 类型的值,对它进行加法运算与整数相同。因此,这等效于:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接