Ответ 1
Точно так же, как:
for(count = 2; zahl % count != 0 && zahl >= count; count++)
{
}
Я нашел следующий код:
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++);
Без этого код не работает должным образом.
Какое объяснение?
Точно так же, как:
for(count = 2; zahl % count != 0 && zahl >= count; count++)
{
}
A для цикла имеет ключевое слово for
, за которым следуют скобки, содержащие три необязательных выражения, разделенные точками с запятой, за которым следует тело, которое выполняется на каждой итерации цикла.
Цель цикла for в вашем примере - установить значение count
, которое будет сравниваться с zahl
в следующем выражении if. Это достигается в выражениях с разделителями с запятой, поэтому тело цикла ничего не нужно делать.
Поскольку цикл не нуждается ни в чем, он использует пустое выражение как свое тело.
Если ;
в конце были опущены и никаких других изменений не было сделано, то оператор if после цикла for сам станет телом цикла for. (Это не предназначено и нарушит программу, как вы это заметили.)
Однако создание одного тела цикла состоит из одного ;
в одной строке, это не единственный способ написать пустой цикл цикла, и это, вероятно, самый разумный способ сделать это. Это работает отлично, но проблема в том, что другие читатели - и, возможно, один и тот же программист, возвращающийся к проекту позже, могут задаться вопросом, действительно ли это была ошибка. В конце концов, некоторые типы точек с запятой на концах строк довольно часто при кодировании на языке C-стиля, поэтому легко ввести дополнительный, где он не принадлежит.
Другая проблема заключается в том, что в коде, где однострочный цикл с ;
как его тело является выбранным стилем, трудно распознать, когда кто-то действительно совершил ошибку, поставив a ;
, когда кто-то делает 't принадлежит.
Следовательно, эти альтернативы могут быть предпочтительными:
;
с отступом в следующую строку как предполагает sh1{ }
, а не пустой операторcontinue;
, которое просто заставляет цикл перемещаться к следующей итерации (что то же самое, что и в случае, когда тело цикла пусто) - также, как предполагает sh1Точка с запятой в конце цикла for означает, что у нее нет тела. Без этой точки с запятой C считает, что оператор if
является телом цикла for.
Синтаксис цикла 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
будет считаться его телом и будет выполнен.
В дополнение к тому, что уже говорят другие отличные ответы, я хотел бы отметить, что
for(count=2; zahl % count != 0 && zahl >= count; count++);
(т.е. цикл for
с пустой инструкцией, используемой для увеличения "счетчика" ), эквивалентен
count=2;
while(zahl % count != 0 && zahl >= count)
{
count++;
}
что сделало бы цель кода еще более ясной, чем некоторые из перечисленных альтернатив: если не присутствуют комментарии, как в представленном случае, цикл с пустым оператором может смутить другого программиста, который должен использовать или использовать код (как в случае с ОП здесь).
Контекст может помочь определить истинную область действия оператора, но между циклом for
с пустым оператором и циклом while
с утверждением последний требует меньше работы, чтобы понять его область действия.
;
после цикла for
просто означает, что цикл for
не будет делать ничего больше, чем увеличение счетчика count
.
Оператор for представляет собой оператор цикла, структура которого позволяет легко инициализация переменных, тестирование выражений и переменная модификация. Это очень удобно для создания встречного контроля петли. Вот общая форма оператора for:
for (initialize; test; step) 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;
}
Поэтому, ведем себя по-другому.
Для цикла for нужно просто увеличить значение count
.
a for
цикл будет (обычно) иметь тело,
где тело заключено в фигурные скобки {
}
Однако для одного тела оператора фигурные скобки необязательны.
;
- пустой оператор.
Объединяя вышеизложенное, становится очевидным, что цикл for
выполняется до тех пор, пока условие не станет false
.
Цикл for в основном перебирает все числа, которые меньше или равны zahl
, но больше 2 и сохраняют его в переменной count
. Когда он проходит все эти числа, он проверяет, делится ли zahl
на count
. Если zahl
делится на count
, цикл останавливается. В противном случае цикл останавливается, когда count
равно zahl
.
Оператор if после цикла for проверяет, соответствует ли count
zahl
. Если это так, то это должно означать, что цикл прошел через все числа меньше zahl
и больше 2. Это означает, что zahl
делится на все числа меньше самого себя и больше 2, что делает zahl
простое число.