# 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
上記の出力の動作を説明できる人はいますか? 異なるカバー仕様を使用するのはばかげていることは知っていますが、理論的な目的を求めているだけです。
# 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
上記の出力の動作を説明できる人はいますか? 異なるカバー仕様を使用するのはばかげていることは知っていますが、理論的な目的を求めているだけです。
上記の出力の動作を説明できる人はいますか?
これは未定義の動作です。
(C11、7.1.4p1) 「関数への引数に [...] がある場合、または可変数の引数を持つ関数によって予期されない型 (昇格後) がある場合、動作は未定義です」
歴史のために、これとまったく同じ質問に対処する C Defect Report (DR#83) があります。
printf
タイプセーフではありません。引数が予期される型であることは、ユーザーの責任です。そうしないと、未定義の動作が発生します。
引数の型がデフォルトでプロモートされるため、さらに興味深いことがあります: short/char
-> int
、float
-> double
。
あなたの例は未定義の動作であるため、何でも取得できますが、実際の引数を構成するバイトが、文字列形式で指定された型の場所であるかのように解釈される可能性があります。float
に昇格されdouble
、%f
仕様も であることに注意してくださいdouble
。これはおそらく 8 バイトですint
が、おそらく 4 バイトです...