Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

C++ redeclaration of loop count variable inconsistent behaviour?

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

like image 208
10100111001 Avatar asked Nov 25 '13 08:11

10100111001


1 Answers

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.

like image 199
masoud Avatar answered Sep 21 '22 13:09

masoud