-5
# include <stdio.h>

int main()
{
 int a=4;
 printf("%f",a);
}

出力

0.000000 

また

# include <stdio.h>

int main()
{
 float a=4.5;
 printf("%d",a);
}

出力

0

上記の出力の動作を説明できる人はいますか? 異なるカバー仕様を使用するのはばかげていることは知っていますが、理論的な目的を求めているだけです。

4

2 に答える 2

2

上記の出力の動作を説明できる人はいますか?

これは未定義の動作です。

(C11、7.1.4p1) 「関数への引数に [...] がある場合、または可変数の引数を持つ関数によって予期されない型 (昇格後) がある場合、動作は未定義です」

歴史のために、これとまったく同じ質問に対処する C Defect Report (DR#83) があります。

http://www.open-std.org/jtc1/sc22/wg14/docs/rr/dr_083.html

于 2013-07-28T12:01:54.503 に答える
0

printfタイプセーフではありません。引数が予期される型であることは、ユーザーの責任です。そうしないと、未定義の動作が発生します。

引数の型がデフォルトでプロモートされるため、さらに興味深いことがあります: short/char-> intfloat-> double

あなたの例は未定義の動作であるため、何でも取得できますが、実際の引数を構成するバイトが、文字列形式で指定された型の場所であるかのように解釈される可能性があります。floatに昇格されdouble%f仕様も であることに注意してくださいdouble。これはおそらく 8 バイトですintが、おそらく 4 バイトです...

于 2013-07-28T12:03:06.787 に答える