为什么当我使用以下操作对字符求和时,它返回数字而不是字符?它不应该给出相同的结果吗?
ret += ... ; // returns numbers ret = ret + ...; // returns chars
下面的代码复制了字符:
doubleChar(“ The”)→“ TThhee”
public String doubleChar(String str) { String ret = ""; for(int i = 0; i < str.length(); i++) { ret = ret + str.charAt(i) + str.charAt(i); // it concatenates the letters correctly //ret += str.charAt(i) + str.charAt(i); // it concatenates numbers } return ret; }
以下表达式的结果
ret + str.charAt(i) + str.charAt(i);
是String连接的结果。Java语言规范说明
字符串串联的结果是对String对象的引用,该对象是两个操作数字符串的串联。在新创建的字符串中,左侧操作数的字符位于右侧操作数的字符之前。
的结果
str.charAt(i) + str.charAt(i);
是将加法运算符应用于两个数字类型的结果。Java语言规范说明
当应用于两个数字类型的操作数时,binary +运算符将执行加法运算,从而得出这些操作数的总和。[…]数字操作数上加法表达式的 类型是其操作数的 提升 类型。
在这种情况下
成为int两个char值的和。然后将其连接到ret。
int
char
ret
您可能还想了解有关复合赋值表达式的信息 +=
+=
形式的复合赋值表达式E1 op= E2等效于E1 = (T) ((E1) op (E2)),其中T是的类型E1,不同之处在于该表达式E1 仅被评估一次。
E1 op= E2
E1 = (T) ((E1) op (E2))
T
E1
换一种说法
ret += str.charAt(i) + str.charAt(i);
相当于
ret = (String) ((ret) + (str.charAt(i) + str.charAt(i))); | ^ integer addition | ^ string concatenation