web-dev-qa-db-ja.com

「短い30 = 3 * 10」が正当な割り当てであるのはなぜですか?

算術演算でshortintに自動的に昇格される場合、その理由は次のとおりです。

short thirty = 10 * 3;

short変数thirty?への正当な割り当て

次に、これ:

short ten = 10;
short three = 3;
short thirty = ten * three; // DOES NOT COMPILE AS EXPECTED

これと同様に:

int ten = 10;
int three = 3;
short thirty = ten * three; // DOES NOT COMPILE AS EXPECTED

int値をshortに割り当てることは期待どおりにキャストしないと許可されないため、コンパイルされません。

数値リテラルについて何か特別なことが起こっていますか?

100
Ceiling Gecko

コンパイラは10*3compile time自体で30に置き換えるためです。したがって、効果的に:short thirty = 10 * 3はコンパイル時に計算されます。

tenthreefinal shortに変更して(コンパイル時定数に変更してください)、何が起こるかを確認してください:P

両方のバージョン(javap -v10*3)のfinal shortを使用してバイトコードを調べます。ほとんど違いがないことがわかります。

OK、だから、ここに異なるケースのバイトコードの違いがあります。

ケース-1:

Javaコード:main(){short s = 10 * 3; }

バイトコード:

stack=1, locals=2, args_size=1
         0: bipush        30  // directly Push 30 into "s"
         2: istore_1      
         3: return   

ケース-2:

public static void main(String arf[])  {
   final short s1= 10;
   final short s2 = 3;
   short s = s1*s2;
}

バイトコード:

  stack=1, locals=4, args_size=1
         0: bipush        10
         2: istore_1      
         3: iconst_3      
         4: istore_2      
         5: bipush        30 // AGAIN, Push 30 directly into "s"
         7: istore_3      
         8: return   

ケース-3:

public static void main(String arf[]) throws Exception {
     short s1= 10;
     short s2 = 3;
     int s = s1*s2;
}

バイトコード:

stack=2, locals=4, args_size=1
         0: bipush        10  // Push constant 10
         2: istore_1      
         3: iconst_3        // use constant 3 
         4: istore_2      
         5: iload_1       
         6: iload_2       
         7: imul          
         8: istore_3      
         9: return 

上記の場合、10および3はローカル変数s1およびs2から取得されます

137
TheLostMind

はい、リテラルの場合には特別なことが行われます:10 * 3compileの時点で評価されます。したがって、乗算されたリテラルに対して明示的な(short)変換は必要ありません。

ten * threeはコンパイル時に評価できないため、明示的な変換が必要です。

tenthreefinalとマークされている場合は、別の問題になります。

18
Bathsheba

次の answer は、JLSセクションとこの動作に関する詳細を追加します。

JLS§15.2-式の形式

一部の式には、コンパイル時に決定できる値があります。これらは定数式です(§15.28)。

0