2017-01-21 7 views
-1

printfを(C言語の)ほとんどの機能を使って再コードする作業があります。しかし、いくつかのテストを行っているうちに、私は問題を発見しました。ユーザーが1つ以上の修飾子を置いたときの標準関数の動作を理解できません。たとえば
Cのprintfのフラグと修飾子

printf("%hhld", 128) results in 128 printed out; 
printf("%lhhd", 128) results in 128 printed out; 
printf("%lhhd", 9223372036854775807) shows 9223372036854775807; 
printf("%lhhd", 9223372036854775808) shows -9223372036854775808; 
printf("%hhld", 9223372036854775807) shows 9223372036854775807; 
printf("%hhld", 9223372036854775808) shows -9223372036854775808; 

何修飾子が選択され、どのようにprintfのそれを選ぶのでしょうか?なぜこの状況では常にhhを無視するのですか?

もう1つの質問は、私のprintfがフラグと修飾子をランダムな順序で使用するかどうかです。ウィキでは、物品は、特定の順序を述べているので:

% [パラメータ] [フラグ] [幅] [精度] [長さ]は、これは未定義の動作である

答えて

3

を入力し、ドキュメントを読んでください。

標準で指定されたものと異なるタイプのパラメータを基本的に渡すことは、標準によって未定義の動作とみなされます。あなたは完全にprintf(3)の振る舞いを理解したい場合は

あなたも「ただのドキュメントを読ん」再び、互換性のない指定子を混合している、これは良いドキュメントです。

+0

あなたは私にそれを説明するか、男性の正確な線を正確に指摘するほど親切ですか?私はそれを何度も読んだことがありますが、私の質問に対する答えはまだ分かりません。 – kjioyh

+0

"* Length Modifier *"セクションの上記の答えでリンクされているドキュメントでは、 "* Aの後の整数変換は...に対応しています"というフレーズは "この長さ修飾子は...としか使用できません"この規則に従わない。これにより、未定義の動作が呼び出されます。 – alk