#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
誰かがこれがなぜであるか説明できますか?
#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
誰かがこれがなぜであるか説明できますか?
への最初の呼び出しprintf()
の書式指定子が多すぎるため、未定義の動作が発生します。この場合、ガベージ値が出力されます。
printf("%d%d%d",i,j); =>
printf に 3 つの整数を出力するように指示していますが、指定したのは 3 つだけなので、printf はスタックからガベージを出力します。他の:
printf("%d",i,j);
整数を 1 つだけ取ることになっていますが、2 つを渡しています。C 言語はこのようなエラーを防げず、何が起こるかは完全に定義されていないため、これらの出力が正確にどのように表示されるかを説明することは、コンパイラの内部を理解していない限り困難であり、そのコードは間違っていて失敗することが予想されるため、あまり役に立ちません。
動作はundefinedです。つまり、この場合に何が起こるかは言語仕様に記載されていません。これは、コンパイラの実装とシステム アーキテクチャに完全に依存します。未定義の動作を説明することは、時には面白く、しばしば腹立たしく、ほとんどの場合役に立たないことがあります-だから心配しないでください!
フォーマット指定子がすべて混同されており、投稿したコードが実際のコードではないと思います。私の Visual Studio コンパイラでは、次のように表示されます。
1020010
それぞれは、整数値の 1 つを挿入%d
する場所を示します。printf
printf("%d%d%d",i,j);
あなたはprintf
3 つ期待するように言いましたが、2 つしか与えませんでした。Turbo C がフードの下の引数で何か違うことをしている可能性がありますが、それでもフォーマット指定子を引数に一致させる必要があります。
printf("%d%d",i,j);