0

同じ明示的な型変換を適用しているため、次のコードの両方で出力が異なるのはなぜですか。

    int hex = (char)0xA;
    System.out.println(hex);

    int hex = 0xA;
    System.out.println((char)hex);
4

2 に答える 2

2

最初の行intで、関数に値を送信しprintlnます。2番目に値を送信 charするため、違いが..

System.out.println(char x)の次 のオーバーロードと、System.out.println(int x)のオーバーロードを検討してください。

于 2012-10-07T14:36:00.263 に答える
0

@Mortalusが答えたように、違いの理由は、ある場合にはintをprintlnに渡し、別の場合にはcharを渡したためです。

最初のケースでは、int ではなく char を作成しようとしていたが、構文が間違っていたことがわかります。それ以外の:

int hex = (char)0xA;

使用する

char hex = 0xA;

上記の最初のステートメントでは、リテラル 0xA は 10 進数値 10 の int リテラルです。次に、値 10 の char に明示的にキャストします。最後に、char を int 変数 hex に割り当てます。10 は int と char の両方に有効であるため、暗黙的な変換が実行され、char は int に変換され、char 変数ではなく int 変数になります。

上記の 2 番目のステートメントでは、同じリテラル値があり、それを char に割り当てています。暗黙的な変換が実行され、値が 10 の char 変数 16 進値があります。

例に対応する変更を加えると、両方が同じ結果を出力することがわかります。

char hex = 0xA;
System.out.println(hex);

int hex = 0xA;
System.out.println((char)hex);

[アップデート]

いずれの場合も、値が 10 の文字が出力されます。これは、事実上すべてのシステムで改行として解釈され、その後にシステム定義の行区切りシーケンスが続きます (println は行区切りを出力に追加することを保証するため)。

Windows では、行は通常 CR LF (13 の後に 10) で区切られますが、Linux/Mac システムでは行は通常 LF (10) で区切られます。

したがって、Windows では、両方のステートメントの結果は 3 バイト (10、13、10) になります。Linux/Mac では、両方のステートメントが 2 バイト (10, 10) になります。

いずれにせよ、出力は 2 行の空白行のように見えます。Linux/Mac では問題なく表示されますが、無効な行区切りを送信しているため、Windows では奇妙に見える場合があります。

ところで - ライン フィードを生成するために上記のコードを実際に使用することはお勧めしません。代わりに、システム プロパティ line.separator を使用し、代わりにその文字列を使用する必要があります。

String newLine = System.getProperty("line.separator").toString();
于 2012-10-07T17:02:15.650 に答える