web-dev-qa-db-ja.com

1つのdoubleは、方程式のすべてのintをdoubleに昇格しますか?

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?
20
Alan Turing

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

これはコンパイラ依存ではありません。 C++は これらの操作の順序 とそれらがどのように変換されるかを明確に定義しています。

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

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

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

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

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

この例では、除算が最初に処理されます。 abはどちらも整数なので、変換は行われません。 a / bの結果はint型で0です。

次に、この結果がdに追加されます。これはint + doubleなので、C++はintをdoubleに変換し、結果はdoubleになります。

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

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

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

36
Slix

1つの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。

9
user529758

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

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が2に昇格されるため、3が浮動小数点数になります。 0.75 + 3、つまり3.75です。

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

これは(a/b)+ dに似ているので、a/bはゼロ、dは4、つまり4です。パーサーはすべての演算を優先順位に従って実行するため、式の結果が正確にわかるようになります。

2
Ramy Al Zuhouri

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

複数のサブ式を持つ複合式では、各演算子は、おそらくご存知の優先規則を使用して、個別に処理されます。したがって、a*b + c*dでは、a*bが評価され、c*dが評価されて、結果が加算されます。 c*dの内容はa*bには影響せず、その逆も同様です。

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

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

1