Подтвердить что ты не робот

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

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

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

#include<stdio.h>

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<stdio.h>

int main(){
    int i, j=2;

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

Выход = 2 2 2

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

4b9b3361

Ответ 1

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

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

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

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

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

Ответ 2

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

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

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


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

Ответ 3

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

#include <stdio.h>

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;        
}

Ответ 4

Wikipedia сообщает, что делает оператор запятой:

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

Ответ 5

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

j >= 0, i <= 5

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

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

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

Ответ 6

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

Ответ 7

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

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

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

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