1
#include <stdio.h>

int main() {
   int i=10,j=20;
   printf("%d%d%d",i,j);
   printf("%d",i,j); 
   return 0;
}

Turbo Cコンパイラを使用すると、出力は次のようになります。

10 10garbageValue

20

誰かがこれがなぜであるか説明できますか?

4

4 に答える 4

2

への最初の呼び出しprintf()の書式指定子が多すぎるため、未定義の動作が発生します。この場合、ガベージ値が出力されます。

于 2012-06-15T15:49:48.233 に答える
2
printf("%d%d%d",i,j); =>

printf に 3 つの整数を出力するように指示していますが、指定したのは 3 つだけなので、printf はスタックからガベージを出力します。他の:

printf("%d",i,j);

整数を 1 つだけ取ることになっていますが、2 つを渡しています。C 言語はこのようなエラーを防げず、何が起こるかは完全に定義されていないため、これらの出力が正確にどのように表示されるかを説明することは、コンパイラの内部を理解していない限り困難であり、そのコードは間違っていて失敗することが予想されるため、あまり役に立ちません。

于 2012-06-15T15:49:52.007 に答える
2

動作はundefinedです。つまり、この場合に何が起こるかは言語仕様に記載されていません。これは、コンパイラの実装とシステム アーキテクチャに完全に依存します。未定義の動作を説明することは、時には面白く、しばしば腹立たしく、ほとんどの場合役に立たないことがあります-だから心配しないでください!

于 2012-06-15T15:50:55.920 に答える
1

フォーマット指定子がすべて混同されており、投稿したコードが実際のコードではないと思います。私の Visual Studio コンパイラでは、次のように表示されます。

1020010

それぞれは、整数値の 1 つを挿入%dする場所を示します。printf

printf("%d%d%d",i,j);

あなたはprintf3 つ期待するように言いましたが、2 つしか与えませんでした。Turbo C がフードの下の引数で何か違うことをしている可能性がありますが、それでもフォーマット指定子を引数に一致させる必要があります。

printf("%d%d",i,j);
于 2012-06-15T15:51:22.460 に答える