Можно ли определить переменную l oop внутри паратезов l oop? - PullRequest
2 голосов
/ 06 апреля 2020

Я новичок в C, но у меня большой опыт в C#. Мой преподаватель колледжа сказал мне, что в «чистом» C неправильно инициализировать переменную l oop внутри паратезов циклов. Он сказал, что он работает из-за компилятора VS. По некоторым причинам весь материал в презентации также показывает циклы с их переменной l oop, объявленной вне паратезов.

for (int i=0; i < 5; i++)
{
   //He says that this is wrong, and you will lose points in tests for that
}

int i;
for (i=0; i < 5; i++)
{
   //Says it should be done like that (i declared outside loop)
}

Это действительно имеет значение? Некоторые компиляторы не распознают это? Потеряю ли я баллы на тесте?

Ответы [ 3 ]

4 голосов
/ 06 апреля 2020

Это определенно не так, но вопрос, какой стандарт C использует ваш компилятор.

Если ваш компилятор использует стандарт ранее, чем C99, то инициализация переменной в заголовке l oop приведет к ошибке, подобной этой.

$ gcc loop.c 
loop.c: In function ‘main’:
loop.c:5: error: ‘for’ loop initial declaration used outside C99 mode

В более поздних стандартах поддерживается тогда. Единственное отличие обоих стилей для вашего кода заключается в том, что область действия переменной ограничена значением l oop, если оно объявлено в заголовке l oop.

Итак, не инициализируя в заголовке l oop, вы делаете свой код немного более переносимым или независимым от стандарта / компилятора. Но большинство людей, которых я знаю, наверняка используют оба стиля.

2 голосов
/ 06 апреля 2020

Это нормально в новых C версиях.

Но есть четкая разница. i имеет различную область действия.

2 голосов
/ 06 апреля 2020

Нет никакой разницы между двумя версиями , когда компилируется с помощью современного компилятора, который соответствует стандарту C99 или выше вместо определения i внутри скобок, i имеет свою область действия и время жизни только внутри соответствующего l oop.

За пределами соответствующего l oop i, который вы используете внутри l oop, не существует. Вы не можете использовать его дважды для другого l oop.

Когда вы пытаетесь скомпилировать код в версии компилятора / компилятора, то есть до стандарта C до C99 с определением i внутри скобок вы получите ошибку компиляции, просто потому что она еще не была введена в язык.

Оба метода имеют свои преимущества и недостатки.

Это причина какой компилятор или версию компилятора вы используете, если вы хотите использовать i после относительного l oop и, тем не менее, вопрос стиля и личного вкуса.

Потеряю ли я баллы на тесте ?

Ну, если бы он / она явно настаивал на этом (даже если вы используете современный компилятор), я бы не стал его беспокоить и просто объявил бы i перед относительной l oop и все в порядке.

Также иногда (если не часто) запрещено использовать методы, не изученные в классе. Вполне возможно, что это придирчивый, но подходящий для этого пример.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...