65

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?

8
  • Interesting. At least GCC gives 1, even with -std=c++98 -pedantic. Commented Jul 22, 2010 at 13:00
  • Compiling this with MSVC9 (15.00.30729.01) gives 1. Commented Jul 22, 2010 at 13:14
  • Sequence Point comes to mind en.wikipedia.org/wiki/Sequence_point Commented Jul 22, 2010 at 13:39
  • 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. Commented Jul 22, 2010 at 14:09
  • 9
    @Schedler i recommend against such code. It's purely a quiz, without any practical background on my part. :) Commented Jul 22, 2010 at 14:15

4 Answers 4

102

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.

Sign up to request clarification or add additional context in comments.

3 Comments

Hm, amazing how subtle yet important "before any other initialization takes place." is.
I wish it was undefined as then we could say don't write stuff like that its hard to work out what you mean without looking it up in the standard.
@Martin York: I, for one, have no problem at all with saying "don't do that", about code like this (and quite a few other things that have defined behavior).
11

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.

Comments

6

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.

Comments

0

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.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.