8

最後の 2 つの print ステートメントで何が起こっているのか説明していただけますか? それが私が迷子になるところです。

public class Something
{
    public static void main(String[] args){
        char whatever = '\u0041';

        System.out.println( '\u0041'); //prints A as expected

        System.out.println(++whatever); //prints B as expected

        System.out.println('\u0041' + 1); //prints 66 I understand the unicode of 1     adds up the 
        //unicode representing 66 but why am I even returning an integer when in the previous statement I returned a char?

        System.out.println('\u0041' + 'A'); //prints 130 I just wanted to show that adding an 
        //integer to the unicode in the previous print statement is not implicit casting because 
        //here I add a char which does not implicitly cast char on the returned value

    }
}
4

3 に答える 3

8

これは、バイナリ数値昇格が原因で発生します

演算子がバイナリ数値昇格をオペランドのペアに適用する場合、各オペランドは数値型に変換可能な値を示す必要があります。必要に応じてオペランドを変換する拡大変換 (§5.1.2) を使用して、次の規則が順番に適用されます。 :

  • オペランドのいずれかが参照型の場合、ボックス化解除変換 (§5.1.8) が実行されます。それで:
  • いずれかのオペランドが double 型の場合、もう一方は double に変換されます。
  • それ以外の場合、いずれかのオペランドが float 型の場合、もう一方は float に変換されます。
  • それ以外の場合、いずれかのオペランドが long 型の場合、もう一方は long に変換されます。
  • それ以外の場合、両方のオペランドが int 型に変換されます。

基本的に、両方のオペランドが に変換されてからintSystem.out.println(int foo)が呼び出されます。+*などによって返される型はdoublefloatlong、およびのみです。int

于 2013-04-05T04:50:51.700 に答える
2

'\u0041' + 1を生成する場合は、javac が呼び出しを) ではなく ) にバインドするようintにキャストする必要があります。charprintln(charprinln(int)

System.out.println((char)('\u0041' + 1)); 
于 2013-04-05T04:49:46.987 に答える