2014-10-14 4 views
0

У меня есть следующий код в C:while цикл не работает должным образом с ||

int main() { 

    int num; 

    printf("Enter 1, 2 or 3:\n"); 
    scanf("%d", &num); 

    while(num != 1 || num != 2 || num != 3) { 
     printf("Try again!\n"); 
     scanf("%d", &num); 
    } 
    return 0; 
} 

В то время как петля никогда не выходит ни на что я вхожу. Что не так с этим кодом?

Когда я ввожу num = 3, цикл while должен быть оценен как false, и он не должен выполняться. Но по какой-то причине это так и есть.

Не могли бы вы рассказать мне, что я делаю неправильно?

Спасибо!

+9

'||' означает "если * любое * из условий истинно" ... –

+1

Для чего вы собираетесь делать, вы должны использовать AND – Mitro

+0

@OliverCharlesworth Хорошо, конечно. Я этого раньше не заметил. :) Как мне изменить код, если одно из условий ложно (так что num = 1, 2 или 3) цикл while не будет выполнен? – SomeOne

ответ

8

Неправильное состояние вашего цикла. Вам необходимо использовать оператор И && вместо оператора OR ||. Когда вы используете оператор OR, вы говорите, что если какое-либо из этих условий истинно, то в этом случае, если вход не 1 или если он не 2 или если он не 3, вы снова включаетесь в цикл. Это означает, что вход должен быть равен 1, 2 и 3 одновременно, что невозможно, следовательно, бесконечный цикл.

Я видел эту ошибку несколько раз; Я думаю, это потому, что люди привыкли использовать OR для обозначения «any», который работает, если условия ORed не отрицаются. Однако, когда вы используете его с отрицательными условиями, такими как , это означает, что все условия (например, x==2) должны быть истинными. Это закон Дейморгана в действии, когда у вас есть булевое выражение этой формы: !x || !y || !z, это фактически эквивалентно !(x && y && z) , который оценивает значение false только при выполнении всех трех условий.

+1

Спасибо! Такая простая ошибка! :) – SomeOne

1

При использовании || в условии: означает: true, если какое-либо из условий истинно. При использовании & & в состоянии означает: return true, если выполняются все условия.

Так что ваше решение:

while(num != 1 && num != 2 && num != 3) 
{ 
    // your code 
} 

Это означает, возвращает истину, если Num не равно 1 и не равно 2 и не равна 3.

2

Ваши условными пересекаются.

Ваше первое условие создает группу, которая имеет каждое число, но 1. Ваше второе условие создает группу, которая имеет каждое число, но 2.

Согласно логическим правилам, OR операнда эквивалентен союза при работе с группами, так:

(Universe - {1}) U (Universe - {2}) = Universe

В основном ваше сравнение всегда будет true с первыми двумя условными.

Смежные вопросы