Почему при использовании оператора && программа заходит в блок if а при использовании опреатора || не заходит
Почему когда я пишу
while (num>0) {
if (num % 10 != 3 && num % 10 != 6) {
OriginNum += num % 10 * check;
check *= 10;
}
num /= 10;
}
}
тогда при num%10 будет равно 3 или 6 оно не зайдёт в блок if а когда вместо && пишу ||
while (num>0) {
if (num % 10 != 3 || num % 10 != 6) {
OriginNum += num % 10 * check;
check *= 10;
}
num /= 10;
}
}
программа заходит в if даже когда num%10 равен 3 или 6
по идее в первом же случае проверяет 6 не равно 3 и 6 не равно 6 - результат false (не заходит в if) а во втором случае проверяет 6 не равно 3 или 6 не равно 6 - результат тоже false потому что 6=6
Так вот ещё раз вопрос почему в втором случае результат не false и программа заходит в if
Кому надо вот весь код
#include <iostream>
using namespace std;
int main(void) {
int num, OriginNum=0;
int check=1;
cout << "I can output number without 3 and 6" << endl;
cout << "Enter number:";
cin >> num;
while (num>0) {
if (num % 10 != 3 || num % 10 != 6) {
OriginNum += num % 10 * check;
check *= 10;
}
num /= 10;
}
}
Ответы (3 шт):
if (num % 10 != 3 && num % 10 != 6) {
соответствует
if (!(num % 10 == 3 || num % 10 == 6)) {
Если число не 3 и не 6 — но оно же может быть таким? скажем, 5?
Если число не 3 или не 6 — Какое бы число мы не взяли, оно будет либо не 3, либо не 6, либо и не 3, и не 6. Т.е. это выражение всегда истинно...
Если это 3 — оно не 6, ура!
Если это 6 — оно не 3, снова ура :)
Если это 1,2,4,5,7 etc — оно таки не 3, и дальше можно и не проверять.
Так понятно?
См. также https://ideone.com/2LgmaD
- Если хоть одно из условий является истинным, то логический оператор
||("или") вернет истину.
Проверяется одно условие _ если это истина(не 3 в данном случаи), то второе условие и не нужно проверять, потому что уже одно из условий есть истина, и оператор вернет true. (Именно исходя из того, что может быть проверено только одно условие, часто этот оператор предпочтительней оператора &&( "И"). Почему часто и не всегда? Это уже другой вопрос...
Если же первое условие не выполняется (если это 3), то проверяется истинность второго условия. И если оно тоже не верно, то только в этом случаи оператор вернет false(то есть когда ни одно из условий не выполняется)
А второе условие, в вашем случаи, конечно выполнится, потому что если дело дошло до него, значит это число заканчивается тройкой и, естественно, не заканчивается шестеркой. Это равносильно тому, чтобы вместо этого оператора написать true. Поэтому ваши условия не разумны. И тут на помощь приходит логический оператор &&("И").
- Логический оператор
&&("И") вернетtrueтолько если оба операнда истины. То есть, в любом случаи проверяются оба условия, и если хоть одно из условий не верно, оператор вернетfalse.
А значит, в вашем случаи, оператор num % 10 != 3 && num % 10 != 6 истина, если это число заканчивается не тройкой и не шестеркой И false, если результат 3 или 6, то если вы хотите написать аналог этого оператора посредством логического ИЛИ, то смотрите ответ от Igor, где просто сказано что это не(3 или 6)