2012-09-27 8 views
5

次のコードは、 'D' と私に出力を提供します:C "%dの" 書式指定子

void main() 
{ 

    short int a=5; 

    printf("%d"+1,a); 

    getch(); 

} 

はどのようprintf()は実際に動作しますか? 1つのフォーマットのみ 指定子と、この(「%dの」+1)があるので、ここで

+0

http://kkmaterials.blogspot.in/2012/06/printf-function-questions-and-answer.html私は、同じ質問がここで尋ねられたと思います。ここで質問する前に質問を検索してみてください。 このサイトと同じ値の質問を投稿するよりも、あなたが宿題をしたことを意味するわけではありません。 –

答えて

6

printfはしていません"%d"にポインタを渡しているため、書式指定子を参照してください。これは、それ自体で通過"d"と同等です:

printf("d", a); 

dを印刷し、aを無視します。これはprintfに固有のものではなく、ポインタ演算はすべてcharポインターのようなもので、文字列リテラル(つまり二重引用符で囲まれた文字列)から得られたポインターも含まれます。そのような「%D」と

3

は問題printf("%d"+1,a);それ文句表示され、エラー

を生成し、それがいずれかになりますprintf("%d+1",a);またはprintf("%d",a+1);

1

文字列リテラルは、配列式であり、ほとんどの状況で、配列の発現は、その値が配列の最初のエレメントのアドレスであるポインタ表現に変換されます:

 
Item  Address  00 01 02 03 
-----  -------  -- -- -- -- 
"%d"  0xfffbec00  '%' 'd' 0 ?? 

文字列リテラル "%d"は、アドレス0xfffbec00(たとえば)から始まります。 "%d"+1を書くことで、結果のポインタ値に1を加えます(0xfffbec01を与える)ので、文字列リテラル "d"をprintfに効果的に渡しています。

文字列 "d"には書式指定子が含まれていないため、printfはそのまま文字列を出力します。引数aは、printfに渡される前にと評価されたですが、それ以外は無視されます。

関連する問題