I'm doing C++ in Visual Studio 2010 and found some odd behaviour. To make a long story short, I found that this won't compile:
for (int i = 0; i < 10; i++) { int i = 11; }
This seems correct, since the variable i is already declared in the for loop header.
Now, however if I insert another for-loop before the re-declaration of i, then suddenly the compiler, intellisense etc thiks the code is correct - giving no real warnings (Tried warnings level 3 and four (/W3 and /w4)). So, doing this will actually compile and run:
for (int i = 0; i < 10; i++) { for(int j = 0; j < 5; j++) { } int i = 11; }
Personally, I find it odd that insering another for-loop legitimates the otherwise same code scenario. Any kind spirit able to tell me what I'm overlooking here?
Thanks in advance!
EDIT: Wow, thanks everyone for all the replies and demos - You are awesome! :) This sample exposing a bug did cross my mind, I just assumed MS would have noticed such a thing by now and fixed it...at least in VS2013.
Tried changing the optimization settings as suggested, but it did not make any difference.
Thanks everybody!
First piece of code
Second piece of code
Credit for demos: @Mark Garcia
According to the standard specification:
1 ... names declared in the for-init-statement are in the same declarative-region as those declared in the condition
3 If the for-init-statement is a declaration, the scope of the name(s) declared extends to the end of the for-statement. [§6.5.3]
and
4 Names declared in the for-init-statement, the for-range-declaration, and in the condition of if, while, for, and switch statements are local to the if, while, for, or switch statement (including the controlled statement), and shall not be redeclared in a subsequent condition of that statement nor in the outermost block (or, for the if statement, any of the outermost blocks) of the controlled statement [§3.3.3]
The behavior of MSVC++2010 is not standard and it's a bug.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With