CodeInChaos в основном правильно, и в связанной статье объясняются правила, которые вы нарушаете.
Вы спрашиваете, почему компилятор не видит разницу, но вы можете.Странный вопрос: очевидно, компилятор может увидеть разницу.Если компилятор не может определить разницу между двумя значениями «index», тогда как он может правильно выдать ошибку ?!Ошибка в том, что есть две вещи, которые означают что-то другое, но имеют одно и то же имя, и поэтому, конечно, компилятор знает, что они разные.Это точно , потому что компилятор знает, что два значения «index» различны, что позволяет ему правильно выдавать ошибку.
Двигаемся дальше.
Наличие двух локальных переменных, которые означают разные вещи, является плохой практикой, приводящей к ошибкам, и поэтому существуют правила, которые предотвращают это.Если вы действительно хотите это сделать, вы можете, но , вам необходимо убедиться, что их области объявлений не перекрываются .Вы можете сделать это, введя дополнительные фигурные скобки:
{
{
int index;
// blah blah blah
}
{
int index;
// blah blah blah
}
}
Потому что теперь нет пробела, в котором "index" одновременно объявляется и означает две разные вещи.(Очевидно, что самое внешнее локальное пространство объявлений - это пространство, в котором «индекс» означает две разные вещи, но индекс не объявлен во внешнем пространстве объявлений.)
"for" и "foreach"Циклы обрабатываются так, как будто они имеют невидимые скобки вокруг всего этого, поэтому это законно:
{
for(int index = 0; index <= 10; ++index) {...}
for(int index = 0; index <= 10; ++index) {...}
}
Компилятор делает вид, что вы на самом деле написали
{
{
int index = 0;
while(index <= 10) { ... }
}
{
int index = 0;
while(index <= 10) { ... }
}
}
Итак, еще раз, "невидимый"фигурные скобки хранят два объявления локальных переменных в текстовом формате.