C99: Могу ли я объявить переменные в начале блока в «для»?

StackOverflow https://stackoverflow.com/questions/1880745

  •  18-09-2019
  •  | 
  •  

Вопрос

Следующий кодекс законным в соответствии с C99?

...
for(....) {
int x = 4;
...
}
...

Вы можете предположить, что до строки 3 переменная x никогда не была объявлена.

C99 (PDF)

До сих пор я нашел только следующее, но я не думаю, что этого достаточно:

Блок позволяет сгруппировать набор объявлений и заявлений в одну синтаксическую единицу. Оцениваются инициализаторы объектов, которые имеют автоматическую продолжительность хранения, и обследователи массивы переменной длины обычных идентификаторов с объемом блоков и значения хранятся в объектах (включая хранение неопределенного значения в объектах без инициализатора) каждый раз достигнут в порядке исполнения, как если бы это было утверждение, и в каждом объявлении в приказе появляются деклараторы.

С стр. 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» помимо его сферы.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top