问题
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