4

コード行があります

double i = 1 + (long)1.5* 5.0f

私の質問は、変換順序と結果は何ですか? このような例を探していましたが、役に立ちませんでした。それを理解するのに役立つ良いガイドはありますか?

4

4 に答える 4

6

私の質問は、変換順序と結果は何ですか?

キャストが に適用され、値を持つ が1.5与えられます。long1

floatこれは、 with の乗算に変換され、 with value5.0fが与えられます。float5.0f

1はその値との加算のために に変換され、 with valuefloatが与えられます。float6.0f

double最後に、それは(値を保持したまま) に昇格され、6.0に割り当てられiます。

これは、小さな整数を正確に表すことができるクレイジーでない浮動小数点形式を想定しています。そうしないと、丸め誤差が発生する可能性があります。

乗算の結果をキャストする場合は、括弧を使用して演算子の優先順位を制御します。

double i = 1 + (long)(1.5* 5.0f);  // = 8.0

または、括弧の使用を強制する C++ スタイルのキャストを使用します。

double i = 1 + static_cast<long>(1.5* 5.0f)

それを理解するのに役立つ良いガイドはありますか?

ここに 1 つがあります: http://en.cppreference.com/w/cpp/language/operator_precedence。型キャストは乗算よりも優先順位が高いことに注意してください。乗算は加算よりも優先されます (3 対 5 対 6)。

于 2013-10-01T13:01:02.097 に答える
1

この表からわかるように、キャスト演算子は乗算よりも優先されますが、アドバイスに従って括弧を使用してください。

于 2013-10-01T13:00:35.033 に答える
0

キャスト演算子の優先順位がわからない場合は、(頭の中で) 式を書き直してください。

(long)1.5 * 5.0

5.0 * (long)1.5

ここでは、何が優先され、最初のバージョンと同じであるかは明らかです

于 2013-10-01T13:41:48.447 に答える