64
votes

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?

4
Interesting. At least GCC gives 1, even with -std=c++98 -pedantic. - Philipp
Compiling this with MSVC9 (15.00.30729.01) gives 1. - akira
Sequence Point comes to mind en.wikipedia.org/wiki/Sequence_point - user195488
Why would someone write code like this? If something, this might/will confuse the static analyzer you're using. I would consider the behaviour undefined, even though many compilers give consistent result x=1. - Schedler
@Schedler i recommend against such code. It's purely a quiz, without any practical background on my part. :) - Johannes Schaub - litb

4 Answers

101
votes

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.

11
votes

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.

6
votes

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.

0
votes

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.