Несколько типов в цикле for

#c

#c

Вопрос:

Возможно ли сделать что-то подобное на C?

 for (int i=0, char c;;)
 

Или типы должны совпадать? Каковы различные возможности для назначения (первой части) for цикла? Например:

 for (int i,j,k=0;;)
for (int i=0, j, k=2;;)
for (int i=0, j=1, k;;)
for (int i, j=1, k;;)
...etc...
 

Ответ №1:

Правила те же, что и в любом другом объявлении: вы можете объявить несколько переменных в одном объявлении, если они имеют один и тот же тип.

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

Каждое имя, введенное в объявлении, может сопровождаться или не сопровождаться инициализатором, поэтому все четыре ваших последних примера действительны.

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

Комментарии:

1. пока они одного типа : не совсем так, как вы можете иметь for (int i = 0, a[10], *p = a;;) ... для еще более запутанного стиля кодирования.

Ответ №2:

Причина, по которой вы не можете иметь

for (int i, char c;;)

по той же причине вы не можете иметь

int i, char c;

В C точки с запятой отделяют один оператор от другого, тогда как запятые делят один оператор на несколько частей. Например, в

int i, n;

существует один оператор инициализации: int <vars> . Если бы вы должны были написать int <vars> char <vars> , это было бы неверно. Это потому, что у вас есть два оператора инициализации, не разделенных точкой с запятой. Запятая также не может быть использована для превращения двух утверждений в одно. Хотя запятая может разделить оператор на более мелкие части, она не может объединить два оператора в один.

for Цикл может содержать только три оператора — один начальный, один условный и один инкрементный. Поскольку инициализация переменной другого типа потребовала бы дополнительного оператора, это невозможно сделать.

PS: Причина, по которой оператор final не требует точки с запятой, заключается в том, что он заключен в круглые скобки как оператор итерации, от которого for зависит цикл.

Комментарии:

1. Я предлагаю взглянуть на en.wikibooks.org/wiki/C_Programming/Statements для получения дополнительной информации 🙂