web-dev-qa-db-ja.com

printfとcoはfloatとdoubleをどのように区別しますか

強く型付けされていないので、適切なメモリサイズを選び、引数の型に基づいて解釈しただけだと思いました。しかし、floatとdoubleはどちらも%fを使用しており、サイズが異なります。

追伸値をtempにキャストしてキャストすることによるプロモーション(これは正しいですか?)

46

それは区別されません。 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);とまったく同じです。デフォルトの引数プロモーションは、キャストと同じ意味です。

66
Steve Jessop