コード スニペットは次のとおりです。
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.valueOfCharacter.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) にキャストされてから加算されます。