2

以下のコードは次のエラーを出します:

エラー:C:\ Users \ Laptop \ algs4 \ hello \ Main.java:8:精度が低下する可能性があります

見つかった:int

必須:短い

import java.util.* ; 
import java.math.* ; 
import java.io.* ; 
public class Main{
    public static void main(String[] args){
        short[][] arr = new short[1][2]; 
        short val = 9 ; 
        arr[0][0] = arr[0][0] + val ; 
    }
}

ただし、以下ではエラーは発生しません。

import java.util.* ; 
import java.math.* ; 
import java.io.* ; 
public class Main{
    public static void main(String[] args){
        short[][] arr = new short[1][2]; 
        short val = 9 ; 
        arr[0][0] += val ; 
    }
}

おそらくこれの理由は何ですか?

4

3 に答える 3

3

試すarr[0][0] = (short)(arr[0][0] + val);

arr[0][0] += val ;

コンパイラがキャストを作成します

于 2013-01-05T16:32:11.413 に答える
3

以下では:

    arr[0][0] = arr[0][0] + val ; 

両方の引数が最初ににプロモートされint、加算が実行され、結果は暗黙的にに狭められshortます。これにより、精度が低下し、エラーが発生する可能性があります。

2番目のバージョン:

    arr[0][0] += val ; 

Java言語仕様により、次と同等であると定義されています。

    arr[0][0] = (short)((int)arr[0][0] + (int)val); 

つまり、これは明示的なキャストがあったかのように動作するため、エラーは発生しません。

明示的なキャストを追加することで、最初のバージョンでも同じ効果を得ることができます。

arr[0][0] = (short)(arr[0][0] + val); 
于 2013-01-05T16:33:13.060 に答える
1
import java.util.* ; 
import java.math.* ; 
import java.io.* ; 
public class timous{
    public static void main(String[] args){
        short[][] arr = new short[1][2]; 
        short val = 9 ; 
        arr[0][0] = (short)(arr[0][0] + val) ; 
    }
}

このコードはエラーを出していません。:)

于 2013-01-05T16:35:10.980 に答える