Это, безусловно, сомнительная конструкция. Дизайн, который зависит от этого поведения, вероятно, плохой дизайн.
Вы пометили это как C ++, но C ++ (разумно, IMO) не позволяет вам перейти в цикл, где переменная была объявлена в первой части оператора for:
int main()
{
int q = 5;
goto inner;
for (int i = 0; i < 4; i++)
{
q *= 2;
inner:
q++;
std::cout << q << std::endl;
}
}
г ++ вывод:
l.cpp: In function ‘int main()’:
l.cpp:12: error: jump to label ‘inner’
l.cpp:7: error: from here
l.cpp:9: error: crosses initialization of ‘int i’
Инициализация i
перед в цикле позволяет программе скомпилироваться нормально (как и следовало ожидать).
Как ни странно, компилирование с помощью gcc -std=c99
(и использование printf
вместо этого) не не выдает ошибку, и на моем компьютере вывод:
6
13
27
55
как и следовало ожидать, если бы i
были инициализированы вне цикла. Это может привести к убеждению, что int i = 0
может быть просто «извлечено» из инициализатора цикла во время компиляции, но i
все еще находится вне области видимости, если попытаться использовать вне цикла.