7

Programming: Principles and Practice using C++ (第 6 刷)の第 3 章で、Stroustrup は次のように述べています( p.68 )sqrt()int

その章に基づいた簡単な C++ プログラムを次に示します。

#include "std_lib_facilities.h"

int main()
{
    int n = 3;
    cout << "Square root of n == " << sqrt(n) << "\n";
}

上記の引用を考えると、このプログラムをコンパイルまたは実行するプロセスが何らかの形で失敗することが予想されます。

驚いたことに、(g++ (GCC) 4.2.1 で) コンパイルして実行すると、エラーや警告なしで成功し、次の完全に適切な出力が生成されました。

Square root of n == 1.73205

したがって、私の質問は次のとおりですsqrt()。本当に が定義されてintいない場合、上記のプログラムが何らかの形で失敗しないのはなぜですか?

4

6 に答える 6

2

sqrtに対して定義されていdoubleます。また、C++ では暗黙的intに変換できます。double

int n = 3;
double x = sqrt(n);    // implicit conversion of n from int to double

値を関数パラメーターとして使用したり、変数に割り当てたりすると、暗黙的な変換が発生する場合があります。

2 番目のケースの例は次のとおりです。

int n = 3;
double x = n;          // implicit conversion of n from int to double

演算子も単なる関数であることに注意してください。intしたがって、 anを aに追加することもできます。これは、実際の追加を呼び出す前にを aにdouble変換します。intdouble

int n = 3;
double x = 1.0;
double sum = n + x;    // implicit conversion of n from int to double
于 2013-10-26T23:54:01.353 に答える
1

intからへの暗黙的な変換があるためdoubleです。

変換すると、コードは次のようになります。

cout << "Square root of n == " << sqrt((double)n) << "\n";
于 2013-10-26T23:54:29.840 に答える
1

コンパイラは実際には自動的に (つまり、「暗黙的に」) 整数をdouble(またはおそらくlong double) に変換し、その値を に送信するためsqrt()です。これは完全に正常で、完全に合法です。

于 2013-10-26T23:55:05.970 に答える