16

私が受けた試験に問題がありました。質問は次のとおりです。

次のコードの出力は次のようになります。

#include<stdio.h>
#include<conio.h>

void main()
{
 int a=5, b=6, c=7;
 printf("%d%d%d");
}

私の答え : printf に必要な引数が指定されていないため、警告が表示されます。
そして、それを実行すると、ガベージ値が得られます。

先生は私にゼロをくれました。彼によると、答えは値が逆の順序で出力される、つまり出力が「765」になるということです。

問題は、彼が Turbo C++ コンパイラを使用しており、私は通常 GCC を使用していることです。点数を取り戻すためのコメントと説明をいただけますか? それとも私の答えは本当に間違っていますか?

4

2 に答える 2

25

これは未定義の動作であるため、絶対に何でも発生する可能性があります。

一部のシステムでは、関数ファミリがスタックから引数をポップする可能性があるため、ローカル変数実際に出力される場合がXprintfあります (stdarg.h 機能は、そのような関数の実装に使用できます)。変数は、マクロが引数を抽出するa,b,cメモリの場所にある可能性があります。va_argこれらはライブラリの実装/実行環境の詳細であり、標準の一部ではないため、ターゲット プラットフォームによって異なる場合があります。

fprintf以下は、関数を説明する c99 標準からの引用です。

7.19.6.1 fprintf 関数

2/ fprintf 関数は、後続の引数を出力用に変換する方法を指定する format が指す文字列の制御下で、stream が指すストリームに出力を書き込みます。フォーマットの引数が不十分な場合、動作は未定義です。 引数が残っている間にフォーマットが使い尽くされた場合、余分な引数は (いつものように) 評価されますが、それ以外の場合は無視されます。fprintf 関数は、フォーマット文字列の終わりに到達すると戻ります。

于 2012-10-30T06:48:24.367 に答える
2

での引数の不一致と引数printfを与えない (この質問のように) は

undefined behaviour

garbageこれらの値を取得するか取得する場合がありますa,b,c。言語標準では定義されていません。

于 2012-10-30T06:51:45.000 に答える