Is this self initialization valid?

僤鯓⒐⒋嵵緔 提交于 2019-11-26 04:47:12

问题


I have this question, which i thought about earlier, but figured it\'s not trivial to answer

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

My question is whether the behavior of the program is defined or undefined if it\'s valid at all. If it\'s defined, is the value of x known in main?


回答1:


I'm pretty sure it's defined, and x should have the value 1. §3.6.2/1 says: "Objects with static storage duration (3.7.1) shall be zero-initialized (8.5) before any other initialization takes place."

After that, I think it's all pretty straightforward.




回答2:


My question is whether the behavior of the program is defined or undefined if it's valid at all. If it's defined, is the value of x known in main?

This code is definitely not clean, but to me it should work predictably.

int x puts the variable into the data segment which is defined to be zero at the program start. Before main(), static initializers are called. For x that is the code x = x + 1. x = 0 + 1 = 1. Thus the main() would return 1.

The code would definitely work in unpredictable fashion if x is a local variable, allocated on stack. State of stack, unlike the data segment, is pretty much guaranteed to contain undefined garbage.




回答3:


The 'x' variable in stored in the .bss, which is filled with 0s when you load the program. Consequently, the value of 'x' is 0 when the program gets loaded in memory.

Then before main is called, "x = x + 1" is executed.

I don't know if it's valid or not, but the behavior is not undefined.




回答4:


Before the main call x must be initialized to 0 therefore it's value must be 1 one you enter main, and you will return 1. It's a defined behavior.



来源:https://stackoverflow.com/questions/3309042/is-this-self-initialization-valid

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!