コード スニペットは次のとおりです。
public static void main (String[]arg)
{
char ca = 'a' ;
char cb = 'b' ;
System.out.println (ca + cb) ;
}
出力は次のとおりです。
195
これはなぜですか?、、または の'a' + 'b'
いずれかになると思います。"ab"
"12"
3
何が起きてる?
コード スニペットは次のとおりです。
public static void main (String[]arg)
{
char ca = 'a' ;
char cb = 'b' ;
System.out.println (ca + cb) ;
}
出力は次のとおりです。
195
これはなぜですか?、、または の'a' + 'b'
いずれかになると思います。"ab"
"12"
3
何が起きてる?
+
of twochar
は算術加算であり、文字列連結ではありません。のようなことをするか、 andメソッドを"" + ca + cb
使用して、演算子が文字列連結になるように、 のオペランドの少なくとも 1 つが aであることを確認する必要があります。String.valueOf
Character.toString
+
String
+
演算子のいずれかのオペランドの型が の場合、String
演算は文字列連結です。それ以外の場合、演算子の各オペランドの
+
型は、プリミティブ数値型に変換可能な型である必要があります。そうしないと、コンパイル時エラーが発生します。
なぜ 195 になるのかというと、それは ASCII の'a' = 97
と'b' = 98
と97 + 98 = 195
.
これは、基本int
とchar
キャストを実行します。
char ch = 'a';
int i = (int) ch;
System.out.println(i); // prints "97"
ch = (char) 99;
System.out.println(ch); // prints "c"
これは、文字エンコーディング スキームの問題を無視しています (初心者は心配する必要はありません... まだ!)。
メモとして、Josh Bloch は、 が文字列連結と整数加算の両方でオーバーロードされているのはかなり残念だと述べてい+
ます (「文字列連結で + 演算子をオーバーロードするのは間違いだった可能性があります。」 -- Java Puzzlers、Puzzle 11: The Last笑う)。この種の混乱の多くは、文字列連結に別のトークンを使用することで簡単に回避できたはずです。
私は Java を話せませんが、195 は 97 + 98 = と の ASCII コードa
ですb
。明らかに、ca
とcb
は整数値として解釈されます。これはおそらく+
、文字列連結が自動的に行われないように見える追加のためです。
この+
演算子は、文字列に対する操作のように文字に対する操作を行いません。ここで何が起こっているかというと、a
とb
が整数の ASCII コードポイント (97 と 98) にキャストされてから加算されます。