64

以前に考えたこの質問がありますが、答えるのは簡単ではないと考えました

int x = x + 1;
int main() {
  return x;
}

私の質問は、プログラムの動作が定義されているか、それがまったく有効である場合に未定義であるかということです。定義されている場合、 の値はx既知mainですか?

4

4 に答える 4

101

私はそれが定義されていると確信しており、x の値は 1 でなければなりません。§3.6.2/1 は次のように述べています。 "

その後は、すべて非常に簡単だと思います。

于 2010-07-22T13:06:34.560 に答える
11

私の質問は、プログラムの動作が定義されているか、それがまったく有効である場合に未定義であるかということです。定義されている場合、x の値はメインで知られていますか?

このコードは間違いなくクリーンではありませんが、私にとっては予想どおりに動作するはずです。

int xプログラムの開始時にゼロと定義されているデータセグメントに変数を入れます。の前main()に、静的初期化子が呼び出されます。そのためxのコードx = x + 1です。x = 0 + 1 = 1. したがって、main() は 1 を返します。

xスタックに割り当てられたローカル変数である場合、コードは間違いなく予測できない方法で動作します。スタックの状態は、データ セグメントとは異なり、未定義のガベージを含むことがほぼ保証されています。

于 2010-07-22T13:12:46.263 に答える
6

「x」変数は .bss に保存され、プログラムをロードすると 0 で埋められます。したがって、プログラムがメモリにロードされると、「x」の値は 0 になります。

次に、main が呼び出される前に、「x = x + 1」が実行されます。

有効かどうかはわかりませんが、動作は未定義ではありません。

于 2010-07-22T13:10:19.523 に答える
0

メイン コールの前に x を 0 に初期化する必要があるため、その値は 1 である必要があり、メインを入力すると 1 が返されます。これは定義済みの動作です。

于 2010-07-22T14:02:24.213 に答える