-1

次の実行時に奇妙なエラーが発生することに興味がありました。

int width = 300;
int var1 = width/3;
int var2 = width * 1/3;
int var3 = width * 2/3;
int var4 = width*(1/3);
int var5 = width * (int)(1/3);
int var6 = (int)(width*(1/3));

System.out.println("Var1: " + var1);
System.out.println("Var2: " + var2);
System.out.println("Var3: " + var3);
System.out.println("Var4: " + var4);
System.out.println("Var5: " + var5);
System.out.println("Var6: " + var6);

出力は次のとおりです。

Var1: 100
Var2: 100
Var3: 200
Var4: 0
Var5: 0
Var6: 0

最後の 3 つの操作で が返されるのはなぜ0ですか? の周りのかっこ1/3は、計算の実行方法によって何かが変わるように見えますが、それを にケース化しようとしてもint、出力は変わりませんでした。

私はとを使用していBlueJ IDEますJava version 1.7.0_17


編集

私は答えを見つけました。作業順序によるものです。parens除算が最初に発生する原因であり、1 int/3 または 2/3 は常に に等しくなり0ます。数が よりも大きいため、すべてでwidth * 2割る前に を発生させても問題ありません。31

時にはそれは単なる基本的な数学です... :)

4

2 に答える 2

3

4 番目のケースでは、これを試してみてください。小数点を追加することで、以前のように整数除算ではなく、小数除算を強制していることに注意してください。

int var4 = width*(1/3.0);

最後の 2 つのケースについては、代わりにこれを試してください。ただし、これは以前の他のケースと同等になります。

int var5 = width * (1/3);
int var6 = (width*(1/3));

(int)1/3つまり0、キャストが除算を戻していることに0注意0してください0。キャストをそのままにしておくと、これらの 2 つのケースがうまくいくはずがありません。

于 2013-06-18T02:29:34.890 に答える
1

関連するので、優先順位も参照してください。

于 2013-06-18T02:42:18.140 に答える