Множество условий в цикле C ‘for’

Я наткнулся на этот кусок кода. Обычно я использую ‘&&’ или ‘||’ для разделения нескольких условий в цикле for , но для этого кода используются запятые.

Удивительно, но если я изменю порядок условий, выход меняется.

 #include int main() { int i, j=2; for(i=0; j>=0,i<=5; i++) { printf("%d ", i+j); j--; } return 0; } 

Выход = 2 2 2 2 2 2

 #include int main(){ int i, j=2; for(i=0; i=0; i++) { printf("%d ", i+j); j--; } return 0; } 

Выход = 2 2 2

Может ли кто-нибудь объяснить причину? Кажется, он проверяет только последнее состояние, разделенное запятыми.

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

 for (i = 0; j >= 0, i <= 5; i++) 

таким образом, эквивалентно

 for (i = 0; i <= 5; i++) 

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

Конечно, правильно, что вы говорите в начале, и логический оператор C && и || это то, что вы обычно используете для «соединения» условий (выражения, которые могут быть оценены как истинные или ложные); оператор запятой не является логическим оператором, и его использование в этом примере не имеет смысла, как объясняют другие пользователи. Вы можете использовать его, например, для «конкатенации» операторов в себе: вы можете инициализировать и обновить j в целом с помощью i; или использовать оператор запятой другими способами

 #include  int main(void) // as std wants { int i, j; // init both i and j; condition, we suppose && is the "original" // intention; update i and j for(i=0, j=2; j>=0 && i<=5; i++, j--) { printf("%d ", i+j); } return 0; } 

Выражение запятой принимает значение последнего (например, самого правого) выражения.

Таким образом, в вашем первом цикле единственное управляющее выражение: i<=5 ; и j>=0 игнорируется.

Во втором цикле j>=0 управляет циклом, а i<=5 игнорируется.


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

Не используйте этот код; тот, кто его написал, явно имеет фундаментальное непонимание языка и не заслуживает доверия. Выражение:

 j >= 0, i <= 5 

оценивает «j> = 0», затем отбрасывает его и ничего не делает с ним. Затем он оценивает «i <= 5» и использует это, и только это, как условие для завершения цикла. Оператор запятой может использоваться осмысленно в условии цикла, когда левый операнд имеет побочные эффекты; вы часто увидите такие вещи, как:

 for (i = 0, j = 0; i < 10; ++i, ++j) . . . 

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

Википедия рассказывает, что делает оператор запятой:

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

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

Завершив ответ г-на Кроккера, будьте осторожны с ++ или – операторами, или я не знаю, может быть, других операторов. Они могут влиять на цикл. например, я видел код, подобный этому в курсе:

 for(int i=0; i++*i<-1, i<3; printf(" %d", i)); 

Результат составит $ 1 2 $. Таким образом, первый оператор повлиял на цикл, в то время как результатом следующего является множество нhive.

 for(int i=0; i<3; printf(" %d", i));