2014-02-15 56 views
0

的问题说,这一切,这里是代码:为什么char连接返回“int”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 = ""; 
     res += str.charAt(0) + str.charAt(2); 
     return res; 
    } 
} 

这将返回:“196”,这是ac的ASCII值的总和! 这是为什么发生? ,我期望得到“ac”。 如果我修改在这样的测试()方法的第二行:

res = res + str.charAt(0)+str.charAt(2); 

结果确实是“AC”。 请有人帮助我这个疑问。我只是无法找到答案!

回答

0

区别在于连接的构造方式。

第一:res += str.charAt(0) + str.charAt(2);

这里,两个char值首先加在一起。发生二进制数字提升(JLS, Section 5.6.2)。

加宽原语转换(§5.1.2)被施加到转换的任一个或由下面的规则中指定的两个操作数:

  • 如果操作数的类型是双,其他被转换为双。

  • 否则,如果任一操作数的类型为float,则另一个操作数转换为float。

  • 否则,如果任一操作数的类型为long,则另一个操作数转换为long。

  • 否则,两个操作数都转换为int类型。

这意味着,值被晋升为int,创建196。然后添加到str,追加"196"

第二:res = res + str.charAt(0) + str.charAt(2);

这里,res + str.charAt(0)首先执行,和一个String加上char追加char(经由String Conversion, JLS 15.18.1,产生了新的String

如果只有一个操作数的表达是。类型为String的字符串,则对另一个操作数执行字符串转换(第5.1.11节)以在运行时产生字符串。

然后,类似地附加第二个char

如果你说

res = res + (str.charAt(0) + str.charAt(2)); 

那么结果将是相同的(追加196)与+=

+0

非常感谢您的回答,一个非常好的解释。但是,在第一种情况下,我使用“+ =”不应该表示“res + str.charAt(0)...”我的意思是什么时候添加“res”的当前值?我认为这就像首先添加“res”的实际值,然后添加其他操作数,但似乎是相反的方式。 – FraK

+0

这是因为'+ ='的优先级低于'+',所以'+'首先出现。 – rgettman

+0

非常感谢您的解释,现在已经编程了将近2年,并且仍然感到困惑或忘记了这些小事情:P – FraK

0

这是因为charAt()返回char值而不是String。因此+运算符在这里不支持串接,但它是两个数字的简单添加。

如果两个操作数+都是数字,则此方法有效。如果其中一个是s String,则+不再添加,但两个操作数都转换为String,并且执行连接。因此,如果你有res到混合的

res + str.charAt(0) 

的结果将是一个String,并使用相同的逻辑,整个事情

res += str.charAt(0) + str.charAt(2); 

也将进行评估,以String

0

字符不是字符串。如果“a”和“c”是字符串,你会期望得到“ac”。字符是表示字符的无符号整数,如果添加任何两个字符,结果将转换为int。如果要将其视为字符或将其分配给声明为char的变量,则必须使用(char)进行投射。

0

JLS §15.18.1. String Concatenation Operator +解释了为什么:

如果只有一个操作数的表达是String类型的,对另一个操作数执行然后字符串的转换(§5.1.11),以产生在运行时的字符串。

对你而言,你在做:char + char。非操作数的类型是String,所以执行经典的数值加法。

0

在一般情况下,如果你想从字符串中提取字符,并得到长度为1的String,而不是char,然后代替:

str.charAt(i) 

,你可以这样做:

str.substring(i, i+1) 

或本:

Character.toString(str.charAt(i)) 

或:

("" + str.charAt(i)) 
相关问题