C99: Могу ли я объявить переменные в начале блока в «для»?
Вопрос
Следующий кодекс законным в соответствии с C99?
...
for(....) {
int x = 4;
...
}
...
Вы можете предположить, что до строки 3 переменная x никогда не была объявлена.
До сих пор я нашел только следующее, но я не думаю, что этого достаточно:
Блок позволяет сгруппировать набор объявлений и заявлений в одну синтаксическую единицу. Оцениваются инициализаторы объектов, которые имеют автоматическую продолжительность хранения, и обследователи массивы переменной длины обычных идентификаторов с объемом блоков и значения хранятся в объектах (включая хранение неопределенного значения в объектах без инициализатора) каждый раз достигнут в порядке исполнения, как если бы это было утверждение, и в каждом объявлении в приказе появляются деклараторы.
С стр. 145 этого PDF.
Решение
Да, вы можете объявить или определить переменную везде, где вы хотите в C99 (в начале блока в C89).
Вы сказали:
«Вы можете предположить, что до строки 3 переменная x никогда не была объявлена».
Даже если бы это было ранее объявлено, вы могли бы объявить новый переменная с тем же именем. Это мешает вам получить доступ к старой переменной в этом блоке.
int x = 0; /* old x */
printf("%d\n", x); /* old x, prints 0 */
do {
int x = 42; /* new x */
printf("%d\n", x); /* new x, prints 42 */
} while (0);
printf("%d\n", x); /* old x, prints 0 */
Я никогда не пробовал следующее в C99. Я действительно не знаю, что происходит :)
Попробую позже, когда получу доступ к (почти) компилятору C99
int x = 0;
do {
printf("%d\n", x); /* old x? new x? crash? Undefined Behaviour? */
int x = 42;
} while (0);
Функция C99 объявления/определения переменных, где бы ни хотелось, не является функцией, которая заставляет меня хотеть измениться :)
Другие советы
Это законно как в C99, так и в C89. Посмотрите на 6.8.2, что определяет оператор Compound
Да, вы можете создать переменную в начале любого блока. Переменная инициализируется каждый раз, когда блок вводится в C ++, вы можете создавать их в любом месте в блоке.
for(....)
{
int x=4;
/*More code*/
}
Да, это законно в C99, но вам не разрешено получать доступ к «X» после блока. Это будет неопределенное поведение, пытаясь получить доступ к «X» помимо его сферы.