以前に考えたこの質問がありますが、答えるのは簡単ではないと考えました
int x = x + 1;
int main() {
return x;
}
私の質問は、プログラムの動作が定義されているか、それがまったく有効である場合に未定義であるかということです。定義されている場合、 の値はx
既知main
ですか?
以前に考えたこの質問がありますが、答えるのは簡単ではないと考えました
int x = x + 1;
int main() {
return x;
}
私の質問は、プログラムの動作が定義されているか、それがまったく有効である場合に未定義であるかということです。定義されている場合、 の値はx
既知main
ですか?
私はそれが定義されていると確信しており、x の値は 1 でなければなりません。§3.6.2/1 は次のように述べています。 "
その後は、すべて非常に簡単だと思います。
私の質問は、プログラムの動作が定義されているか、それがまったく有効である場合に未定義であるかということです。定義されている場合、x の値はメインで知られていますか?
このコードは間違いなくクリーンではありませんが、私にとっては予想どおりに動作するはずです。
int x
プログラムの開始時にゼロと定義されているデータセグメントに変数を入れます。の前main()
に、静的初期化子が呼び出されます。そのためx
のコードx = x + 1
です。x = 0 + 1 = 1
. したがって、main() は 1 を返します。
x
スタックに割り当てられたローカル変数である場合、コードは間違いなく予測できない方法で動作します。スタックの状態は、データ セグメントとは異なり、未定義のガベージを含むことがほぼ保証されています。
「x」変数は .bss に保存され、プログラムをロードすると 0 で埋められます。したがって、プログラムがメモリにロードされると、「x」の値は 0 になります。
次に、main が呼び出される前に、「x = x + 1」が実行されます。
有効かどうかはわかりませんが、動作は未定義ではありません。
メイン コールの前に x を 0 に初期化する必要があるため、その値は 1 である必要があり、メインを入力すると 1 が返されます。これは定義済みの動作です。