追加する際'a' + 'b'
には、195を生成し、出力データ型ですchar
かint
?
追加する際'a' + 'b'
には、195を生成し、出力データ型ですchar
かint
?
回答:
Javaのchar、short、またはbytesを追加した結果は、intです。
- オペランドのいずれかが参照型の場合、ボックス化解除変換(§5.1.8)が実行されます。次に:
- いずれかのオペランドがdouble型の場合、もう一方はdoubleに変換されます。
- それ以外の場合、いずれかのオペランドがfloat型の場合、もう一方はfloatに変換されます。
- それ以外の場合、いずれかのオペランドがlong型の場合、もう一方はlongに変換されます。
- それ以外の場合は、両方のオペランドがint型に変換されます。
ただし、複合代入演算子(+ =など)についての説明に注意してください。
二項演算の結果は左側の変数の型に変換されます...そして変換の結果は変数に格納されます。
例えば:
char x = 1, y = 2;
x = x + y; // compile error: "possible loss of precision (found int, required char)"
x = (char)(x + y); // explicit cast back to char; OK
x += y; // compound operation-assignment; also OK
一般に、結果のタイプを見つける1つの方法は、結果をオブジェクトにキャストして、それがどのクラスであるかを尋ねることです。
System.out.println(((Object)('a' + 'b')).getClass());
// outputs: class java.lang.Integer
パフォーマンスに関心がある場合は、Javaバイトコードには、より小さなデータ型を使用した算術演算専用の命令さえないことに注意してください。たとえば、加算するための命令iadd
(intの場合)、ladd
(longの場合)、(fadd
floatの場合)、dadd
(doubleの場合)があり、それだけです。x += y
小さい型でシミュレートするために、コンパイラーは( "int to char")のiadd
ような命令を使用して、intの上位バイトを使用してゼロにしますi2c
。ネイティブCPUに1バイトまたは2バイトのデータ専用の命令がある場合、実行時にそれを最適化するのはJava仮想マシン次第です。
文字を数値型として解釈するのではなく、文字列として連結したい場合は、それを行う方法がたくさんあります。最も簡単なのは、空の文字列を式に追加することです。文字と文字列を追加すると文字列になるためです。これらの式はすべて、文字列になり"ab"
ます。
'a' + "" + 'b'
"" + 'a' + 'b'
(これ"" + 'a'
は最初に評価されるため機能します。""
代わりに最後にある場合は、次のようになります"195"
)new String(new char[] { 'a', 'b' })
new StringBuilder().append('a').append('b').toString()
String.format("%c%c", 'a', 'b')
について、次の式を学習することをお勧めしますchar
。
char c='A';
int i=c+1;
System.out.println("i = "+i);
これはJavaで完全に有効で66
あり、の文字(Unicode)の対応する値を返しますc+1
。
String temp="";
temp+=c;
System.out.println("temp = "+temp);
これはJavaでは有効すぎて、String型変数はtemp
自動的にc
char型を受け入れtemp=A
、コンソールで生成します。
以下のすべてのステートメントはJavaでも有効です。
Integer intType=new Integer(c);
System.out.println("intType = "+intType);
Double doubleType=new Double(c);
System.out.println("doubleType = "+doubleType);
Float floatType=new Float(c);
System.out.println("floatType = "+floatType);
BigDecimal decimalType=new BigDecimal(c);
System.out.println("decimalType = "+decimalType);
Long longType=new Long(c);
System.out.println("longType = "+longType);
はのc
タイプですchar
が、それぞれのコンストラクターでエラーなしで指定でき、上記のすべてのステートメントは有効なステートメントとして扱われます。それぞれ次の出力を生成します。
intType = 65
doubleType = 65.0
floatType = 65.0
decimalType = 65
longType =65
char
は原始的な数値整数型であるため、変換や昇進を含むこれらの獣のすべての規則に従います。あなたはこれについて読みたいと思うでしょう、そしてJLSはこれのための最高の情報源の1つです:コンバージョンとプロモーション。特に、「5.1.2拡大プリミティブ変換」の短い部分を読んでください。
Javaコンパイラはそれをどちらかとして解釈できます。
プログラムを作成し、コンパイラエラーを探して確認します。
public static void main(String[] args) {
int result1 = 'a' + 'b';
char result2 = 'a' + 'b';
}
それがcharの場合、最初の行はエラーを表示し、2番目の行はエラーを表示しません。それがintの場合、逆のことが起こります。
私はそれをコンパイルしました、そして私は得ました.....エラーはありません。したがって、Javaは両方を受け入れます。
しかし、私がそれらを印刷したとき、私は得ました:
int:195
char:Ã
あなたがするとき何が起こるかということです:
char result2 = 'a' + 'b'
暗黙的な変換が実行されます(intからcharへの「プリミティブナローイング変換」)。
バイナリ昇格規則によれば、オペランドのいずれもdouble、float、またはlongのいずれでもない場合、両方がintに昇格されます。ただし、char型を数値として扱うことは強くお勧めします。そのような場合、その目的は無効になります。
char
数値として使用することは完全にその目的の範囲内であるため、JLSはそのような使用に非常に多くの言い回しを捧げます。
すでに正解がありますが(JLSで参照)、int
2つchar
のを追加したときにが得られることを確認するためのコードを次に示します。
public class CharAdditionTest
{
public static void main(String args[])
{
char a = 'a';
char b = 'b';
Object obj = a + b;
System.out.println(obj.getClass().getName());
}
}
出力は
java.lang.Integer
int
とInteger
は同じものではありません。より説得力のある検証はa + b
、int
変数または変数に割り当てようとすることchar
です。後者は、「あなたが割り当てることができない効果で述べているコンパイルエラー与えint
にchar
」を。
char
はUnicode
値として表され、Unicode値は\u
その後にHexadecimal
値が続きます。
にchar
プロモートされた値に対する算術演算と同様にint
、の結果'a' + 'b'
は次のように計算されます。
1.)Unicode
対応するchar
使用に値を適用しますUnicode Table
2.)16進数から10進数への変換を適用して から、Decimal
値に対して操作を実行します。
char Unicode Decimal
a 0061 97
b 0062 98 +
195
例
0061
(0 * 16 3)+(0 * 16 2)+(6 * 16 1)+(1 * 16 0)
(0 * 4096)+(0 * 256)+(6 * 16)+(1 * 1)
0 + 0 + 96 + 1 = 97
0062
(0 * 16 3)+(0 * 16 2)+(6 * 16 1)+(2 * 16 0)
(0 * 4096)+(0 * 256)+(6 * 16)+(2 * 1)
0 + 0 + 96 + 2 = 98
したがって、 97 + 98 = 195
例2
char Unicode Decimal
Ջ 054b 1355
À 00c0 192
--------
1547 +
1163 -
7 /
260160 *
11 %
一方でBoannの答えが正しいか、の場合に適用される合併症がある定数式、彼らがに表示されたときに割り当てコンテキスト。
次の例を検討してください。
char x = 'a' + 'b'; // OK
char y = 'a';
char z = y + 'b'; // Compilation error
何が起こっている?彼らは同じことを意味しますね?そして、なぜそれが割り当てることが合法であるint
とのchar
最初の例では?
定数式が割り当てコンテキストに現れると、Javaコンパイラは式の値を計算し、それが割り当て先の型の範囲内にあるかどうかを確認します。そうである場合、暗黙のナローイングプリミティブ変換が適用されます。
最初の例で'a' + 'b'
は、は定数式であり、その値はに収まるchar
ため、コンパイラはint
式の結果をchar
。に暗黙的に絞り込むことができます。
2番目の例でy
は、は変数であるためy + 'b'
、定数式ではありません。したがって、Blind Freddyは値が適合することを確認できますが、コンパイラーは暗黙的なナローイングを許可せint
ず、にを割り当てることができないというコンパイルエラーが発生しますchar
。
このコンテキストで暗黙的なナローイングプリミティブ変換が許可される場合には、他にもいくつかの注意点があります。詳細については、JLS5.2およびJLS15.28を参照してください。
後者は、定数式の要件を詳細に説明しています。それはあなたが思うかもしれないものではないかもしれません。(たとえば、y
として宣言するだけでfinal
は役に立ちません。)
char
、その後の値は'a' + 'b'
ないだろう195
けど'Ã'