В чем цель ";" в конце цикла for?

Я нашел следующий код:

int func_prim (int zahl) {
    int count;
    if (zahl < 0)
        return -1;

    for (count = 2; zahl % count != 0 && zahl >= count; count++);
    if (count == zahl)
        return 1;
    return 0;
}

Точка функции - проверить, является ли число простым числом или нет.

Я не понимаю, почему for-loop имеет ; в конце:

                                                            v
for (count = 2; zahl % count != 0 && zahl >= count; count++);

Без этого код не работает должным образом.

Какое объяснение?

Ответ 1

Точно так же, как:

for(count = 2; zahl % count != 0 && zahl >= count; count++)
{
}

Ответ 2

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

Цель цикла for в вашем примере - установить значение count, которое будет сравниваться с zahl в следующем выражении if. Это достигается в выражениях с разделителями с запятой, поэтому тело цикла ничего не нужно делать.

Поскольку цикл не нуждается ни в чем, он использует пустое выражение как свое тело.

Если ; в конце были опущены и никаких других изменений не было сделано, то оператор if после цикла for сам станет телом цикла for. (Это не предназначено и нарушит программу, как вы это заметили.)

Однако создание одного тела цикла состоит из одного ; в одной строке, это не единственный способ написать пустой цикл цикла, и это, вероятно, самый разумный способ сделать это. Это работает отлично, но проблема в том, что другие читатели - и, возможно, один и тот же программист, возвращающийся к проекту позже, могут задаться вопросом, действительно ли это была ошибка. В конце концов, некоторые типы точек с запятой на концах строк довольно часто при кодировании на языке C-стиля, поэтому легко ввести дополнительный, где он не принадлежит.

Другая проблема заключается в том, что в коде, где однострочный цикл с ; как его тело является выбранным стилем, трудно распознать, когда кто-то действительно совершил ошибку, поставив a ;, когда кто-то делает 't принадлежит.

Следовательно, эти альтернативы могут быть предпочтительными:

  • помещая ; с отступом в следующую строку как предполагает sh1
  • запись тела цикла в виде пустого блока { }, а не пустой оператор
  • создавая тело цикла a continue;, которое просто заставляет цикл перемещаться к следующей итерации (что то же самое, что и в случае, когда тело цикла пусто) - также, как предполагает sh1

Ответ 3

Точка с запятой в конце цикла for означает, что у нее нет тела. Без этой точки с запятой C считает, что оператор if является телом цикла for.

Ответ 4

Синтаксис цикла for (оператор итерации)

for ( clause-1 ; expression-2 ; expression-3 ) statement 

statement может быть нулевым (;). C11 6.8.3 говорит

Оператор null (состоящий только из точки с запятой) не выполняет никаких операций.

В параграфе 5 приведен пример

В фрагменте программы

char *s;
/* ... */
while (*s++ != '\0')
    ;

оператор null используется для подачи пустого тела цикла в оператор итерации.

То же самое происходит в

for (count = 2; zahl % count != 0 && zahl >= count; count++);

; используется для подачи пустого тела цикла в оператор for. Без ; оператор рядом с циклом for будет считаться его телом и будет выполнен.

Ответ 5

В дополнение к тому, что уже говорят другие отличные ответы, я хотел бы отметить, что

for(count=2; zahl % count != 0 && zahl >= count; count++);

(т.е. цикл for с пустой инструкцией, используемой для увеличения "счетчика" ), эквивалентен

count=2;
while(zahl % count != 0  && zahl >= count)
{
    count++;
}

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

Контекст может помочь определить истинную область действия оператора, но между циклом for с пустым оператором и циклом while с утверждением последний требует меньше работы, чтобы понять его область действия.

Ответ 6

; после цикла for просто означает, что цикл for не будет делать ничего больше, чем увеличение счетчика count.

Ответ 7

for Заявление:

Оператор for представляет собой оператор цикла, структура которого позволяет легко инициализация переменных, тестирование выражений и переменная модификация. Это очень удобно для создания встречного контроля петли. Вот общая форма оператора for:

 for (initialize; test; step)
   statement

[...]

Null Statement:

Оператор null является просто точкой с запятой.

 ;

Оператор null ничего не делает. Он не сохраняет значение в любом месте. Это не заставляет время проходить во время выполнения вашей программы.

Чаще всего оператор null используется как тело оператора цикла, или как одно или несколько выражений в инструкции for. Вот пример оператора for, который использует нулевой оператор как тело цикл (а также вычисляет целочисленный квадратный корень из n, только для весело):

 for (i = 1; i*i < n; i++)
   ;

Вот еще один пример, который использует оператор null как тело цикл for и также выводит результат:

 for (x = 1; x <= 5; printf ("x is now %d\n", x), x++)
   ;

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


В вашем случае ; является Null Statement for Statement:

int func_prim (int zahl) {
  int count;
  if (zahl < 0)
    return -1;

  for (count = 2; zahl % count != 0 && zahl >= count; count++)
    ;
  if (count == zahl)
    return 1;
  return 0;
}

Без него if становится оператором for:

int func_prim (int zahl) {
  int count;
  if (zahl < 0)
    return -1;

  for (count = 2; zahl % count != 0 && zahl >= count; count++)
    if (count == zahl)
      return 1;
  return 0;
}

Поэтому, ведем себя по-другому.

Ответ 8

Для цикла for нужно просто увеличить значение count.

Ответ 9

a for цикл будет (обычно) иметь тело,

где тело заключено в фигурные скобки { }

Однако для одного тела оператора фигурные скобки необязательны.

; - пустой оператор.

Объединяя вышеизложенное, становится очевидным, что цикл for выполняется до тех пор, пока условие не станет false.

Ответ 10

Цикл for в основном перебирает все числа, которые меньше или равны zahl, но больше 2 и сохраняют его в переменной count. Когда он проходит все эти числа, он проверяет, делится ли zahl на count. Если zahl делится на count, цикл останавливается. В противном случае цикл останавливается, когда count равно zahl.

Оператор if после цикла for проверяет, соответствует ли count zahl. Если это так, то это должно означать, что цикл прошел через все числа меньше zahl и больше 2. Это означает, что zahl делится на все числа меньше самого себя и больше 2, что делает zahl простое число.