2016-10-28 16 views
0

倍精度浮動小数点型(double)の引数を渡している間に、パラメータをintとしてとる関数を呼び出すと、C++での暗黙的変換の使用は何ですか?なぜこれはコンパイル時エラーではないのですか?これを可能にするランタイムスタックでは何が起こるのですか?ここで暗黙の変換と関数の呼び出し

#include <iostream> 
void foo(int num); 

int main() { 
    double doub= 4.9; 
    foo(doub); 
    return 0; 
} 

void foo(int num){ 
    std::cout<<num<<std::endl; 
} 
+3

*これはコンパイル時のエラーではないのですか?* 80年代のプログラミング言語は、現在のように型安全ではありませんでした。 C++はC言語と後方互換性があります。 – DeiDei

+0

ランタイムスタック、何もありません。これは実行時には望んでいません。あなたはコードのいくつかの悪い行をキャッチするためにすべてを遅くするだろう。コンパイラの警告レベルを上げてください。変換警告が表示されます。 – user4581301

+0

@ user4581301 int型とdouble型は同じサイズなので、コンパイラは混乱しませんか?このような暗黙的な変換を行うことは、時には役に立ちますか? –

答えて

2

は、C++がないことimplicit conversionsの全ての長いリストです。

浮動積分変換任意の整数タイプのprvalueに変換することができる浮動小数点型のprvalueをこの特定の一つが下に覆われています。端数部分は に切り捨てられます。つまり、端数部分は破棄されます。値 が宛先タイプに収まらない場合、その動作は未定義です(宛先タイプが符号なしの場合は 、モジュロ演算は が適用されません)。宛先タイプがboolの場合、これはブール値の変換 です(下記参照)。

+0

リンクをありがとうが、私は知っています。暗黙の変換を許可するのは何ですか?私の意見では、それは単にコンパイラのためのより複雑なものになります。今すぐ削除してみませんか? –

+1

@ HamzaKhan40 - 何年ものコードが壊れてしまいます。そのような変更は非常に慎重に扱われます。これをエラーにしたい場合は、コンパイラに適した警告をオンにし、warnings are errorsフラグを設定します。 – user4581301

+0

@HamzaKhan実用的な観点から、人々は数字が数字であることを期待しています。彼らは、数値の整数成分を得るために浮動小数点数を整数に変換することを期待しています。整数を浮動小数点数に変換して、その整数の最も近い浮動小数点表現を作成することを期待しています。 –

関連する問題