強く型付けされていないので、適切なメモリサイズを選び、引数の型に基づいて解釈しただけだと思いました。しかし、floatとdoubleはどちらも%fを使用しており、サイズが異なります。
追伸値をtempにキャストしてキャストすることによるプロモーション(これは正しいですか?)
それは区別されません。 float
を変数引数として受け取ることはできません。指定したfloat
引数は、最初にdouble
に昇格されます。
6.5.2.2/6は「デフォルトの引数のプロモーション」を定義し、/ 7はデフォルトの引数のプロモーションが「末尾の引数」に適用されることを示しています。つまり、_...
_で示される可変引数です。
scanfs/sscanfではどのように機能しますか?
scanf
の_%f
_形式には、float
へのポインターが必要です。 _%lf
_にはdouble
へのポインタが必要です。_%Lf
_には_long double
_へのポインタが必要です。
一時に値をコピーしてキャストする(これでいいですか?)
Float引数を指定すると、実装はdouble型の一時変数を作成し、float値で初期化して、これをvarargとして渡します。定義によるキャストはexplicitキャスト演算子を使用した変換です-何が起こっているかを読者に明確に伝えるために、必要に応じてキャストできますが、float f = 3; printf("%f", f);
はfloat f = 3; printf("%f", (double)f);
とまったく同じです。デフォルトの引数プロモーションは、キャストと同じ意味です。