ЕСЛИ оператор с логическими && и || операторы - PullRequest
1 голос
/ 27 марта 2020

У меня есть следующий код:

if (scanf("%d %d %d", &number1, &number2, &number3) == 3 &&
    ((number1 == rndNumber) || (number2 == rndNumber) || (number3 == rndNumber))) {
    printf("Champ!\n");

} else if ((number1 && number2 > rndNumber) || (number1 && number3 > rndNumber) ||
           (number2 && number3 > rndNumber)) {
    printf("else if!\n");
} else {
    printf("else\n");
}

Если, например, rndNumber: 10

, а для 3-х чисел вводится: 1, 11, 1 или 1, 1 , 11 или 11, 1, 1 или 1, 1, 1

Оператор else будет выполняться только на третьем и четвертом входах. Я не понимаю, почему

1 Ответ

2 голосов
/ 27 марта 2020

Подпункт этого оператора if

} else if ((number1 && number2 > rndNumber) || (number1 && number3 > rndNumber) ||
           (number2 && number3 > rndNumber)) {
    printf("else if!\n");
}

будет выполняться, когда число2 больше, чем rndNumber или когда число 3 больше, чем rndNumber, при условии, что ни число 1, ни число 2 не равны нулю.

Для этих чисел

1, 11, 1 or 1, 1, 11

это условие действительно.

Для этих чисел

11, 1, 1 or 1, 1, 1

условие недействительно.

Обратите внимание, что, например, это подусловие

(number1 && number2 > rndNumber)

эквивалентно

(number1 != 0 && number2 > rndNumber)
...