Java 为什么字符串联返回;int";总和
问题说明了一切,以下是代码:Java 为什么字符串联返回;int";总和,java,string,char,sum,Java,String,Char,Sum,问题说明了一切,以下是代码: public class Chars { public static void main(String[] args){ Chars c = new Chars(); String res = c.test("abcd"); System.out.println(res); } public String test(String str){ String res = "";
public class Chars
{
public static void main(String[] args){
Chars c = new Chars();
String res = c.test("abcd");
System.out.println(res);
}
public String test(String str){
String res = "";
res += str.charAt(0) + str.charAt(2);
return res;
}
}
这将返回:“196”,它是a
和c
的ASCII值之和!
为什么会这样,我希望得到“ac”。
如果我修改test()方法中的第二行,如下所示:
res = res + str.charAt(0)+str.charAt(2);
结果确实是“ac”。
请有人帮我解答这个疑问。我就是找不到答案 这是因为charAt()
返回char值,而不是字符串。因此这里的+
运算符并不代表串联,而是两个数字的简单相加
如果+
的两个操作数都是一个数字,则此操作有效。如果其中一个是sString
,+
不再进行加法,但两个操作数都被强制转换为String
,并执行串联。因此,如果将res
包括在混合中,则
res + str.charAt(0)
将是一个字符串
,使用相同的逻辑,整个过程
res += str.charAt(0) + str.charAt(2);
也将被计算为
字符串不同之处在于串联的构造方式
第一:res+=str.charAt(0)+str.charAt(2)代码>
这里,首先将两个char
值相加。发生二进制数字升级()
加宽基元转换(§5.1.2)用于转换以下规则指定的一个或两个操作数:
- 如果其中一个操作数的类型为double,则另一个操作数将转换为double
- 否则,如果其中一个操作数的类型为float,则另一个操作数将转换为float
- 否则,如果其中一个操作数的类型为long,则另一个操作数将转换为long
- 否则,两个操作数都将转换为int类型
这意味着这些值将提升为int
,从而创建196
。然后将其添加到str
,并在“196”
后面添加
第二:res=res+str.charAt(0)+str.charAt(2)代码>
这里,首先执行res+str.charAt(0)
,一个字符串加上一个char
附加char
(via),产生一个新的字符串
如果只有一个操作数表达式为String类型,则在运行时对另一个操作数执行字符串转换(§5.1.11),以生成字符串
然后,类似地附加第二个char
如果你说
res = res + (str.charAt(0) + str.charAt(2));
然后,结果将与+=
的结果相同(添加196
)。如果“a”和“c”是字符串,则会得到“ac”。字符是表示字符的无符号整数,如果添加任意两个字符,结果将转换为int。必须使用(char)进行强制转换
如果要将其视为字符或将其分配给声明为char
的变量,请解释原因:
如果只有一个操作数表达式的类型为String
,则在运行时对另一个操作数执行字符串转换(§5.1.11),以生成字符串
在本例中,您正在执行:char+char
。操作数的非类型为String,因此执行经典的数字加法。通常,如果您希望从字符串中提取字符,并获得长度为1的字符串,而不是char
,则应:
str.charAt(i)
您可以这样做:
str.substring(i, i+1)
或者这个:
Character.toString(str.charAt(i))
或:
非常感谢您的回答,这是一个很好的解释。但是,在第一种情况下,我使用“+=”不应该表示“res+str.charAt(0)…”我的意思是什么时候加上“res”的当前值?我认为这就像先加上“res”的实际值一样然后添加其他操作数,但似乎情况正好相反。这是因为+=
的优先级低于+
,所以+
首先出现。非常感谢您的解释,已经编程近2年了,仍然会感到困惑或忘记这些小事情:P@FraK联合联络小组说“E1 op=E2相当于E1=(T)((E1)op(E2))”[T
是E1
的类型,但这里不需要它)。注意,它在所有内容周围都放上了括号。因此A+=B
相当于A=(A)+(B)
而不是A=A+B
。
("" + str.charAt(i))