次のコードは、出力を「d」として表示します。
void main()
{
short int a=5;
printf("%d"+1,a);
getch();
}
printf()
実際にはどのように機能しますか?
次のコードは、出力を「d」として表示します。
void main()
{
short int a=5;
printf("%d"+1,a);
getch();
}
printf()
実際にはどのように機能しますか?
printf
"%d"
プラス 1へのポインタを渡しているため、書式指定子を「認識」しません。これは"d"
、それ自体を渡すことと同じです:
printf("d", a);
出力d
して無視しa
ます。これは に固有のものprintf
ではありません。ポインター演算はchar
、文字列リテラル (つまり、二重引用符で囲まれた文字列) から取得されたポインターを含むすべてのポインターで同様に機能します。
printf("%d"+1,a);
これは、フォーマット指定子が 1 つしかなく、これ ("%d"+1) がエラーを生成するため、表示されない問題です。
printf("%d+1",a);
または_printf("%d",a+1);
"%d" などの文字列リテラルは配列式であり、ほとんどのコンテキストでは、配列式は、値が配列の最初の要素のアドレスであるポインター式に変換されます。
商品アドレス 00 01 02 03 ----- ------- -- -- -- -- "%d" 0xfffbec00 '%' 'd' 0 ??
文字列リテラル "%d" はアドレス 0xfffbec00 から始まります (たとえば)。を記述することにより"%d"+1
、結果のポインター値に 1 を追加する (0xfffbec01 を与える) ことになるため、実質的に文字列リテラル "d" を に渡しますprintf
。
文字列 "d" には書式指定子が含まれていないため、printf
文字列をそのまま出力します。引数a
はに渡される前に評価さprintf
れますが、それ以外は無視されます。