2

以下の変数 (b と呼ばれる) は、等号の右側にある唯一のものである場合、式と呼ぶことができますか?

// This code fragment will not compile.
// c is a char, and b is a byte.

c = b;

この質問をする理由は、式内の型昇格のトピックのためです。Java がすべてのバイトを int にプロモートすることを理解しています。それが、このコード フラグメントがコンパイルされない唯一の理由ですか? (私はキャストについて知っていることに注意してください。それはこのスレッドのポイントではありません。どうもありがとう。)

編集: ジョンとピーターに感謝します。2 番目の例を使用してこのトピックを見てみましょう。

byte b = 1;
short s = 2;

s = b;  // OK
s = b*2;  // Not OK (compilation error)

次のようなことが起こっているというのは本当ですか?

(3 行目) Java はバイトを short に変換します。(4 行目) Java は式 b*2 を int に変換します。

これが正しければ、=b; のように見えます。および =b*2; Javaが異なる方法で処理する「式」です。したがって、 =b; 「expression」は int に変換されず、short に拡張されます。しかし、 =b*2; s というターゲット変数が short であっても、expression は short ではなく int に変換されます。

編集2: また -

short s1, s2 = 2, s3 = 2;
s1 = s2*s3;  // Not OK (compilation error)

3 つの変数はすべて short ですが、s2*s3; 式は int に昇格されるため、コンパイル エラーが発生します。

4

2 に答える 2

5

これを試して

byte b = -1;
short s = b; // is ok as a byte can be promoted to an short.
int i = b; // is ok as a byte can be promoted to an int.
float f = b; // is ok as a byte can be promoted to an float, long or double.

char c = b; // won't compile

しかし

final byte b = 1;
char c = b; // compiles fine as the compiler can inline the value.

この場合

short s = b*2;  // Not OK (compilation error)

b * 2 はintそのまま2int値です。最終的な場合b、コンパイルで値をインライン化できる場合、これを行うことができます。

于 2013-11-01T09:04:13.503 に答える
1

以下の変数 (b と呼ばれる) は、等号の右側にある唯一のものである場合、式と呼ぶことができますか?

そのとおり。

Java がすべてのバイトを int にプロモートすることを理解しています。

まあ、場合によっては。すべての場合ではありません。

byteからへの暗黙的な変換がないため、基本的にコードはコンパイルされませんcharJLSのセクション5.1.2から(プリミティブ変換の拡大):

プリミティブ型に対する 19 の特定の変換は、拡張プリミティブ変換と呼ばれます。

  • byteshortintlongfloat、またはdouble
  • ...

charからの変換のターゲット タイプのリストに がないことに注意してくださいbyte

于 2013-11-01T09:05:10.243 に答える