-4

以下を理解するためにあなたの助けをお願いします:

コードの場合:

int main() {
    int i=23;
    float f=7.5;

    printf("%f", i);
    return 1;
}

出力は0.000000、どうしてそうではないの7.500000ですか?

コードの場合

int main() {
    int i=23;
    float f=7.5;

    printf("%d\n",f);
    printf("%f",i);
    return 1;
}

出力は1455115000, 7.500000です。なぜコンパイルエラーが発生しないのですか?この番号1455115000は何ですか?そしてなぜ今7.500000が印刷されているのですか?

4

3 に答える 3

8

呼び出しの形式/引数が一致しprintfないと、未定義の動作が発生します。警告レベルを上げると、コンパイラはおそらくそれを教えてくれます。たとえばclang、最初のプログラムに次の警告を表示します。

example.c:5:10: warning: conversion specifies type 'double' but the argument has
      type 'int' [-Wformat]
printf("%f", i);
        ~^   ~
        %d

そしてあなたの2番目のためのこれらのもの:

example.c:5:10: warning: conversion specifies type 'int' but the argument has
      type 'double' [-Wformat]
printf("%d\n",f);
        ~^    ~
        %f
example.c:6:10: warning: conversion specifies type 'double' but the argument has
      type 'int' [-Wformat]
printf("%f",i);
        ~^  ~
        %d

そして、それは特別なフラグがまったくありません。 gccプログラムでもデフォルトで警告します。例1:

example.c:5: warning: format ‘%f’ expects type ‘double’, but argument 2 has type ‘int’

例2:

example.c:5: warning: format ‘%d’ expects type ‘int’, but argument 2 has type ‘double’
example.c:6: warning: format ‘%f’ expects type ‘double’, but argument 2 has type ‘int’

これらのコンパイラは両方とも、の暗黙の宣言について警告しますprintfが、これらのメッセージは厳密には質問に関連していないため、省略しました。

于 2012-07-15T18:02:17.527 に答える
1

出力は0.000000ですが、なぜ7.500000ではないのですか?

を期待するように%f指示しますが、ではありません。したがって、未定義の動作を呼び出しています。printffloatifloat

なぜコンパイルエラーが発生しないのですか?

GCC(およびおそらく他のコンパイラ)では、警告メッセージが表示されます。

于 2012-07-15T18:02:15.437 に答える
1
  1. 最初のケースでは、の値を出力しようとして、印刷する必要iのある値を取得します。7.5f

  2. 2番目のケースでは、問題はフォーマット指定子と提供された引数との不一致です。printf()

2の詳細。

値を出力するには、フォーマット指定子floatとペアにする必要があります。%fegerint値の場合、これはである必要があります%d。これらは逆方向であるため、この不一致の結果として未定義の動作/出力が表示されます。

最高の警告レベルでプログラムをコンパイルすると、これらのタイプの不一致/エラーに関する警告が表示される場合があります。

通常、の戻り値0は、プログラムが正常に終了したことを示します。ゼロ以外の値(のような1)は問題を示します。おそらくあなたのプログラムには関係ありませんが、覚えておきたいことがあるかもしれません。

于 2012-07-15T18:02:25.777 に答える