Условие для цикла - PullRequest
       2

Условие для цикла

5 голосов
/ 26 ноября 2010

Я экспериментирую с тем, что можно поместить в объявление цикла for в C и как его можно использовать. Я попробовал следующее:

#include <stdio.h>

int stupid(int a)
{
        if(a==3) return 1;
        else return 3;
}

int main(void)
{
        int i,j;
        for(i=0;stupid(i)==3,i<10;i++) printf("%d\n",i);
        return 0;
}

Когда я запускаю программу, она просто печатает число от 1 до 10, и если я ставлю && вместо комы между глупыми (i) == 3 и i <10, то программа просто печатает числа до 3 . Зачем? Я не очень понимаю, как это работает, и я ожидал, что цикл пропустит все числа и «пропустит» 3, но продолжит до 10, и это на самом деле не происходит. Может кто-нибудь объяснить мне, почему и указать мне на какой-то сайт, где это более четко объяснено? Заранее спасибо. </p>

Ответы [ 9 ]

8 голосов
/ 26 ноября 2010

Второе предложение в цикле for (в вашем случае stupid(i)==3,i<10) - это условие, которое оценивается перед каждой записью тела цикла.Если оно оценивается как true, то выполняется тело цикла.Если он оценивается как false, тогда цикл заканчивается и выполнение продолжается после тела цикла.

С запятой (stupid(i)==3,i<10) код оценивает stupid(i)==3, забывает результат и затем оценивает i<10 и использует этот результат для условия цикла.Таким образом, вы получите числа от 0 до 9.

stupid(i)==3 && i<10 будет оцениваться до true, только если обе части выражения верны, поэтому, когда i=3, stupid(i)==3 ложно, и циклвыходит.

3 голосов
/ 26 ноября 2010

Оператор запятой оценивает деталь перед запятой, отбрасывает результат, затем оценивает деталь после запятой и возвращает ее.Так что в вашем цикле for часть после запятой i <10, и это то, что возвращается как условие для цикла for.Вот почему он печатает числа от 1 до 10, если у вас есть оператор запятой. </p>

Если вы поместите в него оператор &&, это означает, что должны выполняться оба условия до и после &&, в противном случаецикл заканчивается.Поэтому, если я == 3, левая часть оценивается как ложная, и ваш цикл заканчивается.

2 голосов
/ 26 ноября 2010

Оператор запятой оценивает оба, но затем в целом возвращает значение своего второго операнда. Поскольку stupid() не имеет никаких побочных эффектов, это означает, что здесь ничего особенного не происходит, и вы просто проверяете, если i<10.

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

0 голосов
/ 01 марта 2014

Если вы сделаете значения счетчика цикла глобальными и назначите i для 4, когда глупо (i) == 3, вы сможете пропустить 3 с помощью этой логики. Ниже приведен модифицированный код. Я выполнил это на Dev-C ++

#include <stdio.h>
int i,j;
int stupid(int a)
{
    if(a==3) 
    i=4;
    else return 3;
}

int main(void)
{
    for(i=0;stupid(i)==3,i<10;i++) printf("%d\n",i);
    return 0;
}
0 голосов
/ 26 ноября 2010
int main(void)
{
        int i,j;
        for(i=0; i<10; i++, i+=i==3) printf("%d\n",i);
        return 0;
}

Ограничение по условию может завершить цикл только тогда, когда условие выполняется, не пропуская итерации. Если вы хотите пропустить какое-то значение, вы должны сделать это при подсчете части for() или сделать это с помощью if()

i+=i==3 добавляет 1 к i, когда i становится 3, так как i==3 оценивается как 1, если условие выполнено, или 0 в противном случае (а добавление 0 просто не дает никакого эффекта).

0 голосов
/ 26 ноября 2010

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

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

Второе является условием, и оно запускается сразу после инициализатора, а затем перед каждой последующей итерацией. Если это правда, операторы цикла выполняются. Если значение равно false, цикл завершен.

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

Ваше условие stupid(i)==3,i<10 использует оператор запятой. Оператор запятой выполняется с каждой стороны, но возвращает только значение с правой стороны. Значение stupid(i)==3 полностью игнорируется. Условие stupid(i)==3 && i<10 выполняется только в том случае, если выполняются обе стороны.

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

 for(i=0; i < 10; ++i) {
    if (stupid(i)==3) {
       printf("%d\n",i);
    }
 }

Это будет проходить через 0-9, но пропустите код, если stupid(i) не равен 3.

0 голосов
/ 26 ноября 2010

Использование оператора , распространяется на каждую выполняемую строку. Ожидается, что в последней строке будет возвращено логическое выражение, указывающее, должна ли быть выполнена следующая итерация. В этом случае, хотя stupid() вызывается, он проверяет только возвращаемое значение из выражения i < 10, чтобы решить дальнейшее выполнение.

0 голосов
/ 26 ноября 2010

Запятая в вашем цикле for действует как оператор ИЛИ.Если какой-либо оператор оценивается как true, тогда цикл останавливает выполнение.

0 голосов
/ 26 ноября 2010

Цикл for будет продолжаться только при соблюдении условий.Если вы поместите оператор if в цикл for, чтобы убедиться, что значение stupid (i) равно трем, цикл for продолжится.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...