2

コード スニペットは次のとおりです。

public static void main (String[]arg) 
{
    char ca = 'a' ; 
    char cb = 'b' ; 
    System.out.println (ca + cb) ; 
}

出力は次のとおりです。

195

これはなぜですか?、、または の'a' + 'b'いずれかになると思います。"ab""12"3

何が起きてる?

4

4 に答える 4

14

+of twocharは算術加算であり、文字列連結ではありません。のようなことをするか、 andメソッドを"" + ca + cb使用して、演算子が文字列連結になるように、 のオペランドの少なくとも 1 つが aであることを確認する必要があります。String.valueOfCharacter.toString+String

JLS 15.18 加法演算子

+演算子のいずれかのオペランドの型が の場合、String演算は文字列連結です。

それ以外の場合、演算子の各オペランドの+型は、プリミティブ数値型に変換可能な型である必要があります。そうしないと、コンパイル時エラーが発生します。

なぜ 195 になるのかというと、それは ASCII の'a' = 97'b' = 9897 + 98 = 195.


これは、基本intcharキャストを実行します。

 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笑う)。この種の混乱の多くは、文字列連結に別のトークンを使用することで簡単に回避できたはずです。


こちらもご覧ください

于 2010-03-11T23:47:07.713 に答える
3

私は Java を話せませんが、195 は 97 + 98 = と の ASCII コードaですb。明らかに、cacbは整数値として解釈されます。これはおそらく+、文字列連結が自動的に行われないように見える追加のためです。

于 2010-03-11T23:47:50.147 に答える
1

この+演算子は、文字列に対する操作のように文字に対する操作を行いません。ここで何が起こっているかというと、abが整数の ASCII コードポイント (97 と 98) にキャストされてから加算されます。

于 2010-03-11T23:49:09.883 に答える