Почему при использовании оператора && программа заходит в блок 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 шт):

Автор решения: Igor
if (num % 10 != 3 && num % 10 != 6) {

соответствует

if (!(num % 10 == 3 || num % 10 == 6)) {
→ Ссылка
Автор решения: Harry

Если число не 3 и не 6 — но оно же может быть таким? скажем, 5?

Если число не 3 или не 6 — Какое бы число мы не взяли, оно будет либо не 3, либо не 6, либо и не 3, и не 6. Т.е. это выражение всегда истинно...

Если это 3 — оно не 6, ура!  
Если это 6 — оно не 3, снова ура :)  
Если это 1,2,4,5,7 etc — оно таки не 3, и дальше можно и не проверять.

Так понятно?

См. также https://ideone.com/2LgmaD

→ Ссылка
Автор решения: AR Hovsepyan
  • Если хоть одно из условий является истинным, то логический оператор || ("или") вернет истину.

Проверяется одно условие _ если это истина(не 3 в данном случаи), то второе условие и не нужно проверять, потому что уже одно из условий есть истина, и оператор вернет true. (Именно исходя из того, что может быть проверено только одно условие, часто этот оператор предпочтительней оператора &&( "И"). Почему часто и не всегда? Это уже другой вопрос...

Если же первое условие не выполняется (если это 3), то проверяется истинность второго условия. И если оно тоже не верно, то только в этом случаи оператор вернет false(то есть когда ни одно из условий не выполняется)

А второе условие, в вашем случаи, конечно выполнится, потому что если дело дошло до него, значит это число заканчивается тройкой и, естественно, не заканчивается шестеркой. Это равносильно тому, чтобы вместо этого оператора написать true. Поэтому ваши условия не разумны. И тут на помощь приходит логический оператор &&("И").

  1. Логический оператор &&("И") вернет true только если оба операнда истины. То есть, в любом случаи проверяются оба условия, и если хоть одно из условий не верно, оператор вернет false.

А значит, в вашем случаи, оператор num % 10 != 3 && num % 10 != 6 истина, если это число заканчивается не тройкой и не шестеркой И false, если результат 3 или 6, то если вы хотите написать аналог этого оператора посредством логического ИЛИ, то смотрите ответ от Igor, где просто сказано что это не(3 или 6)

→ Ссылка