Несколько условий в цикле C 'for'

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

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

#include

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

    for(i=0; j>=0,i
 Caleb31 мая 2013 г., 15:59
Плохой код Вы'правы; несколько условий должны быть объединены с && или ||
 Edward Thomson31 мая 2013 г., 16:00
Пять ответов, каждый воспринимает вопрос слишком буквально и объясняет, что делает запятая, и ни один ответ не говорит о том, что это ужасно, ужасно сломано.

Ответы на вопрос(7)

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

 Robert S. Barnes31 мая 2013 г., 18:29
@EricPostpischil Простите, выражение. Sheesh.
 Caleb31 мая 2013 г., 16:00
Что делает его бесполезным в этом случае - первая проверка состояния не делает ничего полезного.
Решение Вопроса

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

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

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

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

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

 twalberg20 нояб. 2013 г., 22:55
@Caleb На самом делеj>=0 может даже никогда не быть оценен, потому что компилятор, вероятно, заметит, что его значение никогда не используется, и у него нет побочных эффектов, поэтому его можно отбросить как мертвый код ...
 Caleb31 мая 2013 г., 16:02
Важным моментом здесь является то, что данный код неверен.
 Prateek31 мая 2013 г., 23:17
Да, это не производственный код. Я только пересматривал свои основы C и наткнулся на веб-сайт, на котором были вопросы с несколькими вариантами ответов, где я наткнулся на это. Спасибо за ответ.
 user52975831 мая 2013 г., 16:11
Почему отрицательный голос?
 Lee Daniel Crocker31 мая 2013 г., 16:06
этоне могу быть тем, что задумал автор, поскольку это бессмысленно. Я бы не стал доверять ни одному коду этого автора.
 Caleb31 мая 2013 г., 16:07
Первое условие,j>=0, оценивается, но результат никогда не используется. Цикл будет продолжаться до тех пор, пока я неt превышает 5, даже если j меньше 0.выглядит как цикл остановится на J = -1, но он выиграетт. Трудно назвать это чем-то другим, кроме сломанного.
 user52975831 мая 2013 г., 16:03
@Caleb В каком смысле? Я думаю, что я понимаю, что вы пытаетесь предложить, яЯ просто не уверен, что он может или должен быть включен в ответ как есть.

логический оператор && а также|| это то, что вы обычно используете дляподключения» условия (выражения, которые можно оценить как истинные или ложные); оператор запятой не является логическим оператором, и его использование в этом примере не имеет смысла, как объяснили другие пользователи. Вы можете использовать это, например. к "сцепить» утверждения для себя: вы можете инициализировать и обновлять 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;        
}
</stdio.h>

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

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

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

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

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

j >= 0, i <= 5

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

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

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

прошлой (например, самое правое) выражение.

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

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

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

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

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

 tafa31 мая 2013 г., 16:15
@Caleb, честно говоря, я не верю, что вопрос спрашивает, почему. Потому что это говорит:Удивительно, но если я изменяю порядок условий, результат меняется », Отсюда цитирование отвечает на это.
 Caleb31 мая 2013 г., 16:09
-1 Цитата из Википедиине ответить на вопрос, который заключается не в том, что делает запятая, а в том, почему она используется здесь.

Ваш ответ на вопрос