printf()にそれぞれのフォーマット指定子に対して誤った引数タイプが与えられた場合、Cコンパイラはそれを暗黙的に変換しようとしますか?

TG123

さまざまなコンパイラがこれが行われたときに警告を発する場合としない場合があることを読みましたが、何が起こるか/うまくいかない可能性があるかを明示的に示すものは見つかりませんでした。ただし、私の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番目の行が明らかに符号なし整数型ではない場合、ある種の型変換が発生しました。これが全体の話ですか?ありがとう

dbush

printf関数は可変個引数であるため、フォーマット文字列の後のパラメータはすべて、デフォルトの引数プロモーションの対象となりますこの手段よりも、あらゆるタイプの小さいものintに昇格さintfloatに昇格されます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]

編集
0

コメントを追加

0

関連記事

Related 関連記事

ホットタグ

アーカイブ