回答:
これは、整数除算バージョンのを使用しているためです。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、ints として完全に分割する場合は、少なくとも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であるにもかかわらず、結果もゼロになります。