Является ли следующий код законным в соответствии с C99?C99: Можно ли объявить переменные в начале блока в 'for'?
...
for(....) {
int x = 4;
...
}
...
Можно предположить, что перед строкой 3 переменная x никогда не была объявлена.
До сих пор я только нашел следующее, но я не думаю, что это достаточно:
Блок позволяет набор деклараций и заявлений, которые будут сгруппированы в одной синтаксической единицы. Инициализаторы объектов с автоматическим временем хранения и переменной длиной оценщики массива обычных идентификаторов с областью блока, оцениваются и имеют значения , хранящиеся в объектах (включая сохранение неопределенного значения в объектах без инициализатора ) каждый время объявления объявляется в порядке выполнения, как если бы это был оператор , и в каждом объявлении в порядке появления деклараторов.
Со страницы 145 этого PDF.
Старый x. Область автоматической переменной начинается там, где она определена, и выполняется до конца блока. –
Если честно, то затенение автоматических переменных в любом случае довольно сомнительна. Объявление их в начале блока не мешает кому-то пытаться использовать внешнее x и вместо этого получать внутреннее, потому что они забыли, что он есть. Если вы можете доверять кому-то, чтобы справиться с теневыми переменными вообще, я думаю, вы должны доверять им, чтобы знать правила области - если вы все время использовали компилятор C99, вы бы знали их довольно быстро, потому что вы знали бы что, если внешний x вообще не существует, этот цикл C99 не будет компилироваться. –