追加'a' + 'b'
すると 195 が生成されます。出力データ型はchar
ですかint
?
8 に答える
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 つは、結果を Object にキャストし、それがどのクラスであるかを尋ねることです。
System.out.println(((Object)('a' + 'b')).getClass());
// outputs: class java.lang.Integer
パフォーマンスに関心がある場合は、 Java バイトコードには小さいデータ型の演算専用の命令さえないことに注意してください。例えば足し算iadd
なら(intの場合)、ladd
( longの場合)、 fadd
(floatの場合)、dadd
(doubleの場合)とあり、それだけです。x += y
小さい型でシミュレートするために、コンパイラはiadd
int の上位バイトを使用し、i2c
("int to char") のような命令を使用してゼロにします。ネイティブ CPU に 1 バイトまたは 2 バイトのデータ専用の命令がある場合、実行時にそれを最適化するのは Java 仮想マシン次第です。
文字を数値型として解釈するのではなく、文字列として連結したい場合、それを行う方法はたくさんあります。char と String を追加すると String になるため、最も簡単な方法は空の String を式に追加することです。これらの式はすべて String になり"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
and byte
(and ) のバイナリ算術演算は、 JLS 5.6.2short
に昇格します。int
に関する次の表現を学びたいと思うかもしれません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 型の変数は自動的に char 型temp
を受け入れ、コンソールで生成します。c
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 つです: Conversions and Promotions . 特に、「5.1.2 拡張プリミティブ変換」のショート ビットをお読みください。
Java コンパイラは、それをどちらかとして解釈できます。
プログラムを作成し、コンパイラ エラーを探して確認します。
public static void main(String[] args) {
int result1 = 'a' + 'b';
char result2 = 'a' + 'b';
}
文字の場合、最初の行でエラーが発生し、2 行目ではエラーが発生しません。int の場合は、逆のことが起こります。
私はそれをコンパイルし、得ました..... エラーはありません。したがって、Java は両方を受け入れます。
ただし、それらを印刷すると、次のようになりました。
整数: 195
文字: ×
何が起こるかというと、次のようになります。
char result2 = 'a' + 'b'
暗黙的な変換が実行されます ( intからcharへの「プリミティブな縮小変換」)。
正しい答えは既にありますが (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
バイナリ昇格規則 に従って、オペランドが double、float、または long のいずれでもない場合、両方が int に昇格されます。ただし、char型を数値として扱うことは強くお勧めしません。そのようなものは、その目的に反します。