この自己初期化は有効ですか?
-
27-09-2020 - |
質問
この質問があります。以前から考えていましたが、答えるのは簡単ではないと思いました
int x = x + 1;
int main() {
return x;
}
私の質問は、プログラムの動作がそもそも有効である場合、その動作が定義されているか未定義であるかということです。定義されている場合は、次の値になります。 x
で知られている main
?
解決
それは定義されていることを確信しています、そしてxの値が1であるべきです1。行われます。 "
その後、それはすべてかなり簡単なことだと思います。
他のヒント
私の質問は、プログラムの動作がそもそも有効である場合、その動作が定義されているか未定義であるかということです。定義されている場合、x の値は main で既知ですか?
このコードは決してクリーンではありませんが、私にとっては予想通りに動作するはずです。
int x
プログラムの開始時にゼロとして定義されているデータ セグメントに変数を入れます。前に main()
, 、静的初期化子が呼び出されます。のために x
それがコードです x = x + 1
. x = 0 + 1 = 1
. 。したがって、main() は 1 を返します。
次の場合、コードは間違いなく予測不可能な方法で動作するでしょう。 x
はローカル変数であり、スタック上に割り当てられます。データセグメントとは異なり、スタックの状態には未定義のガベージが含まれることがほぼ保証されています。
.BSSに格納されている 'x'変数は、プログラムをロードしたときに0が埋められます。その結果、プログラムがメモリにロードされたときに 'X'の値は0です。
MAINを呼び出す前に、 "x= x + 1"が実行されます。
有効かどうかわからないが、動作は未定義ではない。
メインコールxを0に初期化する必要があるため、値はメインと入力する1つである必要があります。それは1を返します。それは定義された動作です。