29

1つの浮動小数点データ型(たとえばdouble)が存在することで、すべての+、-、*、/、%などの数学演算が2つのオペランドを想定するようになりますか?

話がそれよりも複雑な場合、これらのルールを説明するリソースはありますか?私はそのような質問をするべきではなく、方程式の結果がであるときに常に明示的にキャストintする必要があります。これが私が考えているいくつかの方程式です。これはコンパイラに依存する可能性のあるタイプであるため、意図的にコンパイルしてシステム上で実行しませんでした。doubledouble

int a(1), b(2), c(3);
double d(4.);
double result1 = a + b/d + c; // equal to 4 or to 4.5?
double result2 = (a + b)/d + c; // equal to 3 or to 3.75?    
double result3 = a/b + d; // equal to 4 or to 4.5?
4

4 に答える 4

44

これはコンパイラに依存する可能性のあるタイプのものであるため、意図的に自分のシステムでコンパイルして実行しませんでした。

これはコンパイラに依存しません。C++ では、これらの操作の順序と変換方法が明確に定義されています。

変換がどのように行われるかは、操作の順序によって異なります。

double result1 = a + b / d + c; // equal to 4 or to 4.5?

この例では、除算が最初に発生します。これは int を double で割ったものであるため、コンパイラは int を double に変換してこれを処理します。したがって、 の結果b / dは double です。

C++ が次に行うことはa、 の結果に加算することですb / d。これは double に加算された int であるため、int を double に変換して加算すると double になります。同じことが起こりcます。

double result3 = a / b + d; // equal to 4 or to 4.5?

この例では、除算が最初に処理されます。abは両方とも int であるため、変換は行われません。の結果はa / bint 型で、0 です。

次に、この結果が に加算されdます。これは int と double であるため、C++ は int を double に変換し、結果は double になります。

この式にa / bは double が存在しますが、 が最初に評価され、実行が double に到達するまで double は何の意味もありません。したがって、整数除算が発生します。

プロモーションと変換のルールはかなり複雑だと思います。通常、整数のような数値 (short、int、long) は、同等の浮動小数点数 (float、double) に昇格されます。しかし、サイズの違いや記号によって事態は複雑になります。

変換の詳細については、この質問を参照してください。

于 2012-12-01T21:04:44.430 に答える
10

方程式のdoubleすべてをに昇格させますか?intdouble

いいえ。(優先順位に関して)単一の操作の結果のみ。

double result1 = a + b/d + c; // equal to 4 or to 4.5?

4.5。

double result2 = (a + b)/d + c; // equal to 3 or to 3.75?

3.75。

double result3 = a/b + d; // equal to 4 or to 4.5?

4.4。

于 2012-12-01T20:42:07.483 に答える
3

すべての演算子の優先順位を考慮する必要があり、パーサーのように考える必要があります。

double result1 = a + b/d + c; // equal to 4 or to 4.5?

+ (b/d) +c のようなものです。'/' 演算子が最も優先順位が高いからです。次に、浮動小数点オペランドが中間にあるため、これら 2 つの演算のどちらが最初に行われるかは問題ではありません。他のオペランドに「感染」し、それらを double にします。つまり、4.5 です。

double result2 = (a + b)/d + c; // equal to 3 or to 3.75?  

ここでも同じです。((a+b)/d )+c のようなものなので、a+b は 3 です。3 は double に昇格されるため浮動小数点数になります。 0.75+3、つまり 3.75 です。

double result3 = a/b + d; // equal to 4 or to 4.5?

(a/b)+d のようなものなので、a/b は 0 で d は 4 なので 4 です。パーサーはすべての操作を優先順に行うので、式の結果がどうなるかを正確に知ることができます。

于 2012-12-01T21:16:47.350 に答える
1

通常、二項演算子の一方のオペランドが浮動小数点で、もう一方が整数の場合、整数は浮動小数点に変換され、結果は浮動小数点になります。

複数の部分式を持つ複合式では、各演算子は、おそらくご存知の優先順位規則を使用して個別に処理されます。したがって、 ではa*b + c*da*bが評価され、 が評価さc*dれ、結果が加算されます。in にあるものは inc*dに影響を与えず、a*bその逆も同様です。

もちろん、C++ は複雑であり、ユーザー定義の演算子には他の動作がある場合があります。

ルールを定義する信頼できるリソースは C++ 標準です。標準は非常に大きく、技術的です。最初に C 標準を調べることをお勧めします。標準へのリンクについては、この回答を参照してください。C または C++ に関する優れた本では、デフォルトの型変換と式の評価について説明する必要があります。

于 2012-12-01T20:53:07.073 に答える