簡體   English   中英

java中單引號和雙引號之間的區別?

[英]Difference between single quotes and double quotes in java?

我有

  1. System.out.println(2+" "+3);

  2. System.out.println(2+' '+3);

第一個打印2 3,而第二個打印37可以任何人解釋為什么它打印37 ???

ascii中' '= 32

a:) System.out.println(2+" "+3); // string concatenation

b:) System.out.println(2+' '+3);  // 2+ 32(32 ascii valur for space)+3 so 37

引用附加運算符的 Java語言規范:

如果+運算符的任一操作數的類型是String ,則操作是字符串連接。

否則, +運算符的每個操作數的類型必須是可轉換(第5.1.8節)到原始數字類型的類型

對於數字類型

對操作數執行二進制數字提升(第5.6.2節)

二進制數字促銷

[...]否則,兩個操作數都轉換為int類型。

所以, 2 + " " 2+" "+32 + " " ,這是一個字符串連接,而String + 3也是字符串連接,因此2 + " " + 3"2" + " " + "3"這意味着"2 3"

2 + ' ' 2+' '+32 + ' ' ,空格文字是char ,因此它被轉換為int (32),而2 + 32 + 337


如果文字是變量,它實際上就是這樣,其中對變量的賦值僅用於說明中間結果的類型:

// String concatenation
String s = new StringBuilder().append(2).append(" ").append(3).toString();
System.out.println(s);

// Numeric addition
int n = 2 + (int)' ' + 3;
System.out.println(n);

append()println()都被重載,因此它們不是完全相同的方法。

因為它們是文字,而不是變量,編譯器會在編譯時完成它,你真的得到了這個(嘗試反匯編.class文件以便自己查看):

System.out.println("2 3");
System.out.println(37);

第一個是將所有內容轉換為字符串。 第二個是轉換為整數。 空格的十進制代碼是32.如果你想要2和3是字符串,那么使用引號。

那是因為你正在打印2 2+ ' ' +3的整數值,它會將' '作為char而不是string轉換為簡單地將b)部分轉換為它的ASCII值,這將導致2 + ASCII value of Space + 3 ,最終結果為37,因為space的ASCII值為32。

第一個例子是執行字符串連接,所以答案非常直觀。 第二個例子是不同的,因為''不是一個字符串,它是一個字符。 char被轉換為整數代碼,這就是你得到這個數字的原因。

像這里的連接幾乎是Java容忍的一種情況。 在其他上下文中,char''和String“”顯示為true:有很多不同的類型。

除非System.out.println的輸出參數顯式為java.lang.String否則java會自動將它作為輸出參數給出的任何數據類型和對象轉換為java.lang.String

在你的第一個例子中, System.out.println(2+" "+3); java所做的是掃描輸出參數並找到一個int (2),雙引號" "表示雙引號內的字符數組將被解釋為String ,另一個int (3)。 Java將String " "視為提示,參數中的其他所有內容也應被視為字符串。 那么有效的是System.out.println(2+" "+3); 被視為你已經寫好了

System.out.println(Integer.toString(2)+" "+Integer.toString(3));

在你的第二個例子中, System.out.println(2+' '+3); 相同的過程發生,但java找到' ' - 由單引號包圍的空格,告訴java它正在使用原始數據類型char - 這就是為什么java將此作為一個附加處理的原因操作: 所有java原始數據類型都是數字 - 所以java接受該提示並將輸出參數解釋為int (2),加法運算符(+), char (空格字符) - 與unsigned short ,加法運算符(+)和另一個int (3)。 空白字符的數字值為32,因此幕后轉換會像您編寫的那樣處理您的語句

System.out.println(Integer.toString(2+32+3));

當然,幕后進行的解析比我在這里描述的要復雜得多。 你為什么不試試:

    System.out.println("The answer is "+(3+" "+2));
    System.out.println("The answer is "+(3+2));
    System.out.println("The answer is "+(3+' '+2));

甚至

System.out.println('a' + 'b' + 'c');

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM