5

Mac OS X で C 言語でプログラミングをしています。私は math.h の sqrt を次のような関数で使用しています。

int start = Data -> start_number;
double localSum;

for (start; start <= end; start++) {
    localSum += sqrt(start);
}

これは機能しますが、なぜですか?なぜ私は警告を受けていないのですか?sqrt のマニュアル ページでは、パラメーターとして double を取りますが、int を指定します。どのように機能しますか?

ありがとう

4

4 に答える 4

11

精度の低下を引き起こさない型変換では、警告がスローされない場合があります。それらは暗黙的にキャストされます。

int --> double //no loss in precision (e.g 3 became 3.00)
double --> int //loss in precision (e.g. 3.01222 became 3)

何が警告をトリガーし、何が警告をトリガーしないかは、コンパイラーとそれに提供されるフラグに大きく依存しますが、ほとんどのコンパイラー (少なくとも私が使用したもの)は、警告を正当化するのに十分な暗黙の型変換を考慮していませんdangerous。これは言語仕様の機能です。


警告するかしないか:

C99 Rationale はそれをガイドラインのように述べています

この (暗黙のキャスト) 問題を調査することの重要な結果の 1 つは、高品質のコンパイラがそのような疑わしいコードを探して (オプションの) 診断を提供するのに適している可能性があること、および良心的なインストラクターがプログラマーに問題を警告するのに適している可能性があることを理解することです。暗黙の型変換。

C99 根拠 (2003 年 4 月) : 45 ページ

于 2012-11-01T13:59:14.987 に答える
3

コンパイラは のプロトタイプを認識しているため、関数を呼び出す前に引数をsqrt変換するコードを生成できます。intdouble

同じことが逆の場合にも当てはまります。引数doubleを取る関数 (既知のプロトタイプを持つ) に aを渡すintと、コンパイラは必要な変換コードを生成します。

コンパイラがそのような変換について警告するかどうかは、コンパイラと、コマンド ラインで要求した警告レベルに依存します。

int -> double通常 (IEEE754 形式の 32 ビット (または 16 ビット)intおよび 64 ビットで) ロスレスである変換の場合、そのdoubles変換の警告を取得することは、可能であれば困難です。

double -> intgcc と clang を使用した変換では、 を使用してそのような警告を具体的に要求する必要があります。そうしない-Wconversionと、コードがサイレントにコンパイルされます。

于 2012-11-01T14:12:32.410 に答える
1

データ損失のリスクがないため、Int は安全に double に自動的にアップキャストできます。逆は当てはまりません。double を int に変換するには、明示的にキャストする必要があります。

于 2012-11-01T13:59:59.623 に答える
0

C コンパイラは、double と int を使用していくつかの自動キャストを行います。次のこともできます。

int start = Data -> start_number;
int localSum;

for (start; start <= end; start++) {
   localSum += sqrt(start);
}

localSum が int であっても、これは機能しますが、ポイントを超えるものは常にカットされます。
たとえば、sqrt() の戻り値が 1.365 の場合、単純な 1 として格納されます。

于 2012-11-01T14:02:49.337 に答える