呼び出しの形式/引数が一致しprintf
ないと、未定義の動作が発生します。警告レベルを上げると、コンパイラはおそらくそれを教えてくれます。たとえばclang
、最初のプログラムに次の警告を表示します。
example.c:5:10: warning: conversion specifies type 'double' but the argument has
type 'int' [-Wformat]
printf("%f", i);
~^ ~
%d
そしてあなたの2番目のためのこれらのもの:
example.c:5:10: warning: conversion specifies type 'int' but the argument has
type 'double' [-Wformat]
printf("%d\n",f);
~^ ~
%f
example.c:6:10: warning: conversion specifies type 'double' but the argument has
type 'int' [-Wformat]
printf("%f",i);
~^ ~
%d
そして、それは特別なフラグがまったくありません。 gcc
プログラムでもデフォルトで警告します。例1:
example.c:5: warning: format ‘%f’ expects type ‘double’, but argument 2 has type ‘int’
例2:
example.c:5: warning: format ‘%d’ expects type ‘int’, but argument 2 has type ‘double’
example.c:6: warning: format ‘%f’ expects type ‘double’, but argument 2 has type ‘int’
これらのコンパイラは両方とも、の暗黙の宣言について警告しますprintf
が、これらのメッセージは厳密には質問に関連していないため、省略しました。