javaに2 charデータ型を追加する

ケース1:

char c='A'+'A'; 
System.out.println(c);  //print question mark (?)

ケース2:

char c1='A';
char c2='A'+c1;  //Compile time error
System.out.println(c2);   

case1論理がある2つの文字リテラルを追加しているとき、ascii値の合計が表示されます。これは疑問符のascii値と同じです。 しかしcase2では、なぜコンパイル時エラーが「 intからcharに変換できません」と表示されるのです。

char + char = intの場合、この規則は両方の場合に適用する必要があります。

5
この問題は、実行時に絞り込み変換が必要となるすべての整数型に当てはまります。 (そして、これが意味をなす唯一の方法です。なぜなら、UTF-16コード単位をUTF-16コード単位に追加することの意味は何ですか?)
追加された 著者 Tom Blodget,

4 答え

最初のケースでは2つの final が追加され、コンパイル時に結果のintがcharをオーバーフローしないことがチェックされます。

2番目のケースでは、1つのオペランドが最後ではなく、コンパイラーは合計の実行を拒否します。 ちょっと馬鹿げた話ですが、マルチスレッドや他のケースを考えると、おそらく正当化できます。少なくともわかりやすい規則。

やる

final char c1 = '0';
char c2 = '1' + c1;//'a'

コンパイルする必要があります。

(言うまでもなく、 '0' + '1' のようなことは絶対にしないでください。)

2
追加された
"定数変数 " .html#jls-15.28最後のものに加えて "rel =" nofollow noreferrer ">"定数式 "。しかしいつものように考慮すべきコストと利益のトレードオフがあります
追加された 著者 Hulk,
考えてみると、このようなJLSの変更は、実行時とコンパイル時にどのコードが評価され、どのコードが到達不能と見なされるかに影響するため、後方互換性はありません。 クラスの初期化
追加された 著者 Hulk,

2番目のケースでは、エラーがあります。 "nofollow noreferrer"> JLS 5.6.2 バイナリ式の両方のオペランドがintに変換されます。

それを機能させるには、明示的なキャストを追加する必要があります。

char c2=(char)('A'+c1);
1
追加された
バイナリ式の両方のオペランドはintに変換されます。 1番目のケースにも適用されます。しかし、それはうまくいっています。
追加された 著者 Randhir,

int型またはint型より小さい2つ以上の変数の加算は、int型になります。

そのため、 char c2 = 'A' + c1; で何をしても、実際にはcharの結果は得られません。暗黙のうちにbyteにキャストしようとしているint型の結果が得られ、コンパイル時エラーが発生します。

まとめ   Char + Char = Int   また、CharはIntを直接格納できません。

Try and do this instead char c2 = (char)('A' + c1);

ここでは、int型の値をchar型に明示的に型キャストします。 起こりうる 損失のある変換 を受け入れる準備ができたことをコンパイラに伝えます

1
追加された
ケース1では、 char 変数ではなく定数の追加を保存しています。
追加された 著者 404 Brain Not Found,
char + char = intは最初の場合にも適用できます。しかしケース1はうまく機能しています。
追加された 著者 Randhir,

Javaのchar、short、bytesを追加した結果はintです。

See the detailed answers on this post: In Java, is the result of the addition of two chars an int or a char?

0
追加された