#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 для получения дополнительной информации 🙂