0
main(){
  printf("%d %d",1234.5);
}

出力:0 1083394560

これは、float変数がdoubleとして扱われ、最初%dに0が表示され、残りの4バイトの値(1083394560)が表示されるデフォルトの引数プロモーションの場合です。

私の質問は、%d最初の4バイトを読み取る場合、このプログラムはどのように実行されるかです。

main()
{
  printf("%f",1234.5);
}

正しい出力を提供します。floatも4バイトであるため、のように動作する必要があります%d

4

3 に答える 3

1

は?もちろん、vararg引数として渡されたものがより大きなもの()にプロモートされた%fことを「知る」ことができ、それに応じて動作します。のコードは、プロモートされた浮動小数点値を期待する必要があることを認識していません。(適切にプロモートされた)を期待します。floatdouble%dint

于 2012-05-18T06:34:01.717 に答える
1

%fフォーマット文字列はdouble引数リストの値を取り、それを出力します。接尾辞のない浮動小数点リテラルはdoubleCではsであり、そのdoubleはデフォルトの昇格規則によって昇格または変更されないため、2番目の例ではまったく魔法が起こりません。

最初の例は未定義動作です。何かが起こる可能性があります。

C99§7.19.6.1関数_fprintf

フォーマットの引数が不十分な場合、動作は定義されていません。

[...]

いずれかの引数が対応する変換仕様の正しいタイプでない場合、動作は未定義です。

于 2012-05-18T06:48:20.103 に答える
0

あなたは自分であなたの質問に答えます:

これは、float変数がdoubleとして扱われるデフォルトの引数プロモーションの場合です。

もちろん、%fこのデフォルトの引数の昇格について知っており、doublesではなくsのみを扱いfloatます。

于 2012-05-18T07:13:13.870 に答える