2009-12-10 2 views
1

Является ли следующий код законным в соответствии с C99?C99: Можно ли объявить переменные в начале блока в 'for'?

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

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

C99 (PDF)

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

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

Со страницы 145 этого PDF.

ответ

7

Да, вы можете объявить или определить переменную где угодно в C99 (в начале блока в C89).

Вы сказали:

«Вы можете предположить, что до строки 3 переменных й не было объявлен.»

Даже если это было ранее объявлено, вы могли бы объявить новую переменную с тем же именем. Это предотвращает доступ к старой переменной внутри этого блока.

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 декларирования/определения переменных, где один хочет не является особенностью, которая заставляет меня хотеть изменить :)

+1

Старый x. Область автоматической переменной начинается там, где она определена, и выполняется до конца блока. –

+1

Если честно, то затенение автоматических переменных в любом случае довольно сомнительна. Объявление их в начале блока не мешает кому-то пытаться использовать внешнее x и вместо этого получать внутреннее, потому что они забыли, что он есть. Если вы можете доверять кому-то, чтобы справиться с теневыми переменными вообще, я думаю, вы должны доверять им, чтобы знать правила области - если вы все время использовали компилятор C99, вы бы знали их довольно быстро, потому что вы знали бы что, если внешний x вообще не существует, этот цикл C99 не будет компилироваться. –

13

Это законно как для C99, так и для C89. Посмотрите на 6.8.2, который определяет составную формулу

+1

Можете ли вы добавить немного больше деталей? В какой из трех случаев я нахожусь? Спасибо! – quilby

+0

@quilby: В C89 вы можете объявлять переменные в начале любой новой области, которая является {} блоком. В C99 вы можете объявлять переменные везде, где хотите в области. – 2009-12-10 13:06:06

+0

Любая идея, было ли это впервые введено в C89 или присутствовало в более ранних версиях C? http://programmers.stackexchange.com/questions/300223/when-was-block-scope-for-variables-introduced-to-c-and-why-is-it-still-frowned – cnst

1

Да, вы можете создать переменную в начале любого блока. Переменная инициализируется каждый раз, когда блок вводится. В C++ вы можете создавать их в любом месте блока.

+1

В C99 вы можете создать их в любом месте. – nos

+0

Показывает, сколько кодирования C99 я делаю :-) – 2009-12-10 12:53:21

1
for(....) 
{ 
    int x=4; 
    /*More code*/ 
} 

Да это законно в C99, но вы не можете получить доступ «х» после того, как block.It будет Неопределенное поведение пытается получить доступ к «х» за ее рамки.

+1

Это не было бы неопределенным поведением. Было бы ошибкой компиляции ссылаться на 'x' вне ее области. –

 Смежные вопросы

  • Нет связанных вопросов^_^