Зачем ";"не используется для i ++ в цикле for.Разве все не должно заканчиваться на ";"? - PullRequest
0 голосов
/ 28 марта 2019

Почему бы не использовать ; после i++ в цикле for?

Рассмотрим,

for (int i= 0; i < 50; i++) {

}

В этом случае, почему люди не добавляют ; после i++

Ответы [ 6 ]

12 голосов
/ 28 марта 2019

Если вы написали i++ как независимое заявление, вам нужно поставить после него ;.

void foo(int i)
{
    i++   // syntax error, missing ';'
}

Но вам не нужно ставить точку с запятой после третьего выражения в заголовке цикла for, потому что вместо этого есть закрывающая скобка. Это правило о for, а не правило о ++. Независимо от того, что вы помещаете в заголовок цикла for, после третьего выражения ставите закрывающую скобку, а не точку с запятой.

for (listnode *p = list_head; *p; p = p->next) // correct
8 голосов
/ 28 марта 2019

Потому что это цикл.Цикл for имеет вид:

for ( init_clause ; cond_expression ; iteration_expression ) loop_statement 

i++ - это выражение.i++; это утверждение.

3 голосов
/ 28 марта 2019

В этом случае, почему люди не добавляют; позади i ++?

Поскольку синтаксис языка не позволяет этого:

<code>for ( <em>expression<sub>opt</sub></em> ; <em>expression<sub>opt</sub></em> ; <em>expression<sub>opt</sub></em> ) <em>statement</em>

В секции управления цикла for, ; действует как разделитель между тремя (необязательными) выражениями, а не как терминатор оператора.

2 голосов
/ 28 марта 2019

Существует различие между выражением и утверждением.Например, следующее выражение считается выражением:

i++

, а выражение выражения считается следующим:

i++;

Поскольку в стандарте указан синтаксис цикла foris:

for ( expression(opt) ; expression(opt) ; expression(opt) ) statement

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

Примечание: opt означает необязательный.

2 голосов
/ 28 марта 2019

Так создается цикл for, который одинаков во многих других языках. Цикл for имеет 3 параметра, которые разделены ;. Первый вариант - это начальный оператор, в котором вы обычно инициализируете счетчик, но вы можете добавить сюда другие вещи и разделить их с помощью ,. Вот пример:

(int i = 0, int k = 100; i < k; i++, k--)

И у вас нет ; после i++ по той же причине, по которой у вас его нет в параметрах методов. Например, вы не можете написать while(true;)

0 голосов
/ 28 марта 2019

Почему «;» не используется для i ++ в языке Си. Разве все не должно быть в конечном итоге «;»?

Нет, "все" не заканчивается точкой с запятой. Большинство операторов и все объявлений заканчиваются точкой с запятой, но i++ является выражением . То есть он выражает операцию, которая производит значение. То, что оно также имеет побочный эффект, не имеет отношения к этому анализу. Другие выражения включают i + 1, i > 0, i в одиночку и даже i = 42, среди множества других. Ни один из них не требует конечной точки с запятой в общем случае, и все они могут использоваться как подвыражения более сложных выражений.

C действительно имеет понятие «выражение оператора», где выражение может использоваться как оператор (для его побочных эффектов). В этом случае оператор завершается точкой с запятой, как и многие другие типы операторов. На самом деле они очень распространены в коде C, потому что присваивания и вызовы функций являются выражениями, а операторы выражений, сделанные из выражений этих типов, составляют основную часть большинства кодов C. Но утверждения не должны быть истолкованы как «все».

Почему бы не использовать ; после i++ в цикле for?

Проще говоря, это потому, что язык требует, чтобы вы этого не делали. Что касается моих предыдущих комментариев, то это потому, что третье предложение управляющего блока оператора for требует выражения, а не оператора.

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