89

追加'a' + 'b'すると 195 が生成されます。出力データ型はcharですかint?

4

8 に答える 8

141

Java char、short、または bytes を追加した結果はintになります。

2 進数昇格に関する Java 言語仕様:

  • オペランドのいずれかが参照型の場合、ボックス化解除変換 (§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小さい型でシミュレートするために、コンパイラはiaddint の上位バイトを使用し、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')
于 2011-12-31T14:43:28.370 に答える
22

charand byte(and ) のバイナリ算術演算は、 JLS 5.6.2shortに昇格します。int

于 2011-12-31T14:40:28.753 に答える
7

に関する次の表現を学びたいと思うかもしれません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を受け入れ、コンソールで生成します。ctemp=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 拡張プリミティブ変換」のショート ビットをお読みください。

于 2011-12-31T14:46:14.390 に答える
3

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への「プリミティブな縮小変換」)。

于 2011-12-31T14:47:34.047 に答える
1

正しい答えは既にありますが (JLS で参照)、int2 つの を追加したときにが得られることを確認するためのコードを次に示します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

于 2011-12-31T16:01:58.223 に答える
1

バイナリ昇格規則 に従って、オペランドが double、float、または long のいずれでもない場合、両方が int に昇格されます。ただし、char型を数値として扱うことは強くお勧めしません。そのようなものは、その目的に反します。

于 2011-12-31T14:41:47.820 に答える