回答:
これは、整数除算バージョンのを使用しているためです。operator/
これは2 int
秒かかり、を返しますint
。double
を返すバージョンを使用するには、double
少なくとも1つのをint
明示的ににキャストする必要がありますdouble
。
c = a/(double)b;
a
とb
にdouble
明確にするため、単純に、それは本当に問題ではありません。
static_cast<>
いつも私には長い間、うんざりしていた。プリミティブの場合は、実際に得ることの危険性がないstatic_cast<>
とreinterpret_cast<>
ミックスアップ。
static_cast
この場合は避けて、代わりにCスタイルのキャストを使用したいと思います。ここでC ++スタイルのキャストを使用してもメリットはなく、Cスタイルのキャストよりもコードが煩雑になります。算術キャストは、Cスタイルのキャストが完全に適切であり、実際には他のキャストよりも適切なコンテキストです。
double(b)
。明示的なコンストラクター呼び出しと同じように見えるため、変換であるとは必ずしも認識しません。
ここにあります:
a)2つint
のsを除算すると、常に整数除算が実行されます。したがって、a/b
あなたの場合の結果は、int
ます。
を保持a
しb
、int
s として完全に分割する場合は、少なくとも1つをdoubleにキャストする必要があります:(double)a/b
またはa/(double)b
または(double)a/(double)b
。
B)c
であるdouble
ことができるので、受け入れますint
:assignementに値をint
自動的に変換されdouble
且つに割り当てられましたc
。
c)代入時に、の右側の式が最初に=
計算され(上記の規則(a)に従って、かつの左側の変数に関係なく)、次に(に従って)の左側の変数に割り当てられるb)上記)。これで全体像は完成したと思います。=
=
非常に少数の例外を除いて(1つしか考えられません)、C ++は式自体から式(または部分式)の全体的な意味を決定します。式の結果をどのように処理するかは重要ではありません。あなたの場合、式a / b
にdouble
は見えません。すべてですint
。したがって、コンパイラは整数除算を使用します。結果が得られると、それをどうするかを検討し、に変換しdouble
ます。
&funcname
キャストする型によって異なります。
C ++言語では、subexpresisonの結果が周囲のコンテキストに影響されることはありません(まれな例外はあります)。これは、言語が注意深く従う原則の1つです。式にc = a / b
含まれている独立した部分式はa / b
、その部分式の外にあるものからは独立して解釈されます。言語は、後で結果をに割り当てることを気にしませんdouble
。a / b
整数除算です。他は何でも構いません。言語仕様の多くのコーナーでこの原則が守られていることがわかります。これは、C ++(およびC)がどのように機能するかを示しています。
上で述べた例外の1つの例は、関数のオーバーロードを伴う状況での関数ポインターの割り当て/初期化です。
void foo(int);
void foo(double);
void (*p)(double) = &foo; // automatically selects `foo(fouble)`
これは、割り当て/初期化の左側が右側の動作に影響する1つのコンテキストです。(また、配列への参照の初期化により、同様の動作の別の例である配列型の減衰が防止されます。)他のすべての場合では、右側は左側を完全に無視します。
これは技術的には言語に依存しますが、ほとんどすべての言語でこの主題は同じように扱われます。式の2つのデータ型の間に型の不一致がある場合、ほとんどの言語は=
、事前定義された一連のルールに従って、一方の側のデータをキャストして、もう一方の側のデータと一致させようとします。
同じ型の2つの数値(整数、倍精度など)を除算すると、結果は常に同じ型になります(したがって、「int / int」は常にintになります)。
この場合、計算後にdouble var = integer result
整数の結果をdouble にキャストします。この場合
、小数データは既に失われています。(ほとんどの言語は、このキャストを行って、例外やエラーを発生させずに型の不正確さを防ぎます)。
結果を2倍にしたい場合は、次のような状況を作りたいと思うでしょう。
double var = double result
これを行う最も簡単な方法は、方程式の右辺の式を強制的に2倍にキャストすることです。
c = a/(double)b
整数とdoubleを除算すると、整数がdoubleにキャストされます(計算を行う場合、コンパイラーはデータ損失を防ぐために、最も具体的なデータ型に「アップキャスト」することが多いことに注意してください)。
a
アップキャストの後、ダブルとして巻き上げられ、今、あなたは2つのダブルの間の分割を持っています。これにより、目的の部門と割り当てが作成されます。
再び、これは言語固有であることに注意してください(ただし、コンパイラ固有でもかまいません)。ただし、ほとんどすべての言語(確かに頭の中で考えられるすべての言語)がこの例を同じように扱います。
重要なのは、計算の要素の1つがfloat-double型であることです。次に、二重の結果を取得するには、次のようにこの要素をキャストする必要があります。
c = static_cast<double>(a) / b;
またはc = a / static_cast(b);
または、直接作成することもできます::
c = 7.0 / 3;
float-double型の整数による除算を示すには、計算の要素の1つに「.0」が必要であることに注意してください。そうでなければ、c変数がdoubleであるにもかかわらず、結果もゼロになります。