さまざまなコンパイラがこれが行われたときに警告を発する場合としない場合があることを読みましたが、何が起こるか/うまくいかない可能性があるかを明示的に示すものは見つかりませんでした。ただし、私のmingw64 g ++コンパイラは、少なくとも単純な暗黙の変換を実行しているように見えます(可能な場合)。例えば:
#include <stdio.h>
int main(void) {
unsigned number = -1;
printf("%u\n%d\n", number, number); //%d being incorrect and %u correct
return 0;
}
単に出力:
4294967295
-1
最初の行が単にラップされた符号なしの値(予期される)であるが、2番目の行が明らかに符号なし整数型ではない場合、ある種の型変換が発生しました。これが全体の話ですか?ありがとう
printf
関数は可変個引数であるため、フォーマット文字列の後のパラメータはすべて、デフォルトの引数プロモーションの対象となります。この手段よりも、あらゆるタイプの小さいものint
に昇格さint
とfloat
に昇格されますdouble
。これらは、引数に発生する唯一の変換です。
渡された引数がフォーマット文字列が期待するものと一致しない場合は、未定義の動作を呼び出します。
たとえば、これは有効です。
float f = 1.2f;
printf("f=%f\n", f);
ので%f
期待しdouble
、そしてf
に促進されるdouble
関数に渡される前に。
これではありません:
float f = 1.2f;
printf("f=%d\n", f);
のでdouble
渡されたが、%d
読むことを期待していますint
。
その他の例:
short s = 3;
long long x = 5;
printf("%d\n", s); // valid: s is promoted to int
printf("%d\n", x); // invalid: no promotion happens and a long long
// was passed but an int was expected
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加