
プログラミング言語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 ) );
といったようにわざわざキャストしなくても自動で仮引数の型でキャストされて関数が呼び出されると理解してもよいのでしょうか.
実行結果から明らかだろ,思われてしまうかもしれませんが,何かの参考書に記述されているのを見たり,人からそう教わったわけではなく,また関数のオーバーロードのこともありますので,質問させて頂きました.よろしくお願いいたします.
No.1ベストアンサー
- 回答日時:
関数呼び出し時の引数の割り当ては基本的に「初期化」として処理されます. つまり, 今の例だと関数呼び出しによって
double val = i;
double val2 = i*2;
という初期化がなされることになります. 右辺にキャストは必要でしょうか?
代入演算と暗黙変換,なるほどです.
試しにintを引数にとる関数を用意してdoubleを与えたら,ちゃんと警告が出て,呼び出し時に(int)キャストして明示変換してやれば警告はなくなりました.
通常の代入と同じですね.
回答ありがとうございました.
No.3
- 回答日時:
T1/T2 演算を行う際に、T1とT2のどちらかが実数であれば演算は実数で行われる。
T1,T2の両方が整数の場合、演算は整数で行われる。
キャストが付いてるか付いてないか、関数の中か外かの問題ではなく演算自体がどの型で行われるかの違いです。
リテラルで考えると分かりやすくて
1/i は整数で演算が行われ i>1 なら必ず0になる。
1.0/i は実数で演算が行われるので 0 にならない。
実数どうし、整数どうしの場合は演算はより精度の高いほうの型で行われます。
※実行結果の格納は別の問題です。
この辺りはコンパイラの作りの問題に近いので「コンパイラの作り方」みたいな本を参考にされたほうが理解が早いかもしれません。
No.2
- 回答日時:
関数に引数に限らず、ただの代入でも同様でしょう。
int i;
double val;
i = 10;
val = i;
このような場合、
最後の代入で暗黙の型変換が行われることは分かりますよね?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C++のcinの動作 5 2023/02/26 00:13
- C言語・C++・C# c言語でユーザ関数を利用して複素数のべき乗と絶対値の数列を計算するプログラムが作りたいです。 3 2023/01/29 22:13
- C言語・C++・C# (C言語)めちゃくちゃな値になってしまいます。 5 2022/08/13 11:55
- C言語・C++・C# このプログラミングの問題を教えてほしいです。 キーボードからデータ数nとn個のデータを入力し、平均値 3 2022/12/19 22:51
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、以下のプログラムをどう直せ 1 2022/07/09 22:16
- C言語・C++・C# C言語初心者 構造体 課題について 1 2023/03/10 19:30
- C言語・C++・C# Cのdoubleの浮動小数点表示について 3 2023/04/17 13:14
- C言語・C++・C# c言語について 下記の計算結果を出力するコードを記述する問題で 0-4 3.14×2 5÷3 30÷ 5 2022/05/17 22:41
- C言語・C++・C# C++で割り算の結果を昇順に出力するプログラムを作りたいのですが、例えば(double)100000 3 2022/07/15 17:46
- C言語・C++・C# C言語のマクローリン展開ローラン展開のコードについて 3 2022/12/15 14:45
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
プログラムでの数字につく”f”の...
-
C言語 関数プロトタイプ宣言の...
-
物体が往復する動きを作りたい
-
doubleの変数にintとintの割り...
-
float型とdouble型の変数の違い...
-
文字列をfloatで読み込む(atoi,...
-
C言語を実行すると-infが出てき...
-
C言語 初心者です
-
C言語の型による処理速度の違い
-
DWORDの警告
-
C言語初心者 構造体 課題について
-
Cプログラミングの問題です。ニ...
-
至急です! マクロ定義で #defi...
-
C言語で-23乗を取り扱うには
-
C 開放してるのにエラー(doubl...
-
sin(x)の近似について
-
c言語のコンパイルエラー canno...
-
C言語(プログラミング)関連の質...
-
関数におけるif文とreturn文に...
-
2次方程式の解を求めるプログ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
プログラムでの数字につく”f”の...
-
float型とdouble型の変数の違い...
-
C言語を実行すると-infが出てき...
-
C 開放してるのにエラー(doubl...
-
c言語で、繰り返し文の中で、0....
-
doubleの変数にintとintの割り...
-
至急です! マクロ定義で #defi...
-
C言語の型による処理速度の違い
-
C言語 関数プロトタイプ宣言の...
-
2次方程式の解を求めるプログ...
-
関数におけるif文とreturn文に...
-
doubleは常に%lfとするべきなのか
-
int とdoubleの比較
-
C言語のプログラムで#include<m...
-
C言語で-23乗を取り扱うには
-
データ数の多い構造体配列
-
指数の表示
-
C言語のpow関数の不具合
-
c言語のプログラミングについて...
-
c言語のコンパイルエラー canno...
おすすめ情報