アプリ版:「スタンプのみでお礼する」機能のリリースについて

プログラミング言語C,C++の数値計算に関する質問です.

整数データ変数同士のみの計算結果は小数点以下は切り捨てられますよね.
もし実数型で計結果を得たいときは,int変数を(double)や(float)でキャストしてあげなければならないことは知っています.

ここで,仮引数リストにdouble型変数が設定されている関数の引数にint型変数を与えた時,関数の呼び出し時にキャストしなくても自動でキャストされるのでしょうか.

以下のサンプルコードを作成し,実行してみた結果を次に示します.

---サンプル---
#include <iostream>

using namespace std;

void printDouble(double val, double val2)
{
cout << "(double)val = " << val / val2 << endl;
}

int main(void)
{
for (int i = 1; i < 5; i++) {
cout << i / (i * 2) << endl;
printDouble(i,i*2);
}
}

-----実行結果----
0
(double)val = 0.5
0
(double)val = 0.5
0
(double)val = 0.5
0
(double)val = 0.5
-------------------------
関数の外での計算は整数に丸められてしまうので
i / ( i * 2 ) 計算結果はゼロに,関数の中では与えられた i はdouble型として扱われるので小数点以下の値も残っているということですよね.

この場合,printDouble関数へ整数を与えるときには
printDouble( (double)i , (double)( i * 2 ) );
といったようにわざわざキャストしなくても自動で仮引数の型でキャストされて関数が呼び出されると理解してもよいのでしょうか.

実行結果から明らかだろ,思われてしまうかもしれませんが,何かの参考書に記述されているのを見たり,人からそう教わったわけではなく,また関数のオーバーロードのこともありますので,質問させて頂きました.よろしくお願いいたします.

A 回答 (3件)

関数呼び出し時の引数の割り当ては基本的に「初期化」として処理されます. つまり, 今の例だと関数呼び出しによって


double val = i;
double val2 = i*2;
という初期化がなされることになります. 右辺にキャストは必要でしょうか?
    • good
    • 0
この回答へのお礼

代入演算と暗黙変換,なるほどです.

試しにintを引数にとる関数を用意してdoubleを与えたら,ちゃんと警告が出て,呼び出し時に(int)キャストして明示変換してやれば警告はなくなりました.
通常の代入と同じですね.

回答ありがとうございました.

お礼日時:2014/11/04 10:32

T1/T2 演算を行う際に、T1とT2のどちらかが実数であれば演算は実数で行われる。


T1,T2の両方が整数の場合、演算は整数で行われる。
キャストが付いてるか付いてないか、関数の中か外かの問題ではなく演算自体がどの型で行われるかの違いです。

リテラルで考えると分かりやすくて
1/i は整数で演算が行われ i>1 なら必ず0になる。
1.0/i は実数で演算が行われるので 0 にならない。

実数どうし、整数どうしの場合は演算はより精度の高いほうの型で行われます。
※実行結果の格納は別の問題です。

この辺りはコンパイラの作りの問題に近いので「コンパイラの作り方」みたいな本を参考にされたほうが理解が早いかもしれません。
    • good
    • 0

関数に引数に限らず、ただの代入でも同様でしょう。



int i;
double val;
i = 10;
val = i;

このような場合、
最後の代入で暗黙の型変換が行われることは分かりますよね?
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!