2014-02-15 54 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)) 
相關問題