Эквивалентность отрицательного выражения в цикле Do-while - PullRequest
0 голосов
/ 03 октября 2019

Новое для сообщества и программирования. Мне было любопытно, почему эти два логических утверждения эквивалентны в моей программе. Кажется, я не могу сейчас обернуться вокруг этой конкретной логики, и я хотел понять, почему она работает таким образом.

Изначально я написал следующее:

    char c;
    do {
        cin >> c;
        cout << "You entered: " << c << "\n";
    } while (c != 'Y' || c != 'y' || c != 'N' || c || 'n');
    return 0;
}

Однако, похоже, это не сработает, если я не использую &&. Позже я узнал, что использую или работает, но мое отрицание должно быть снаружи. Это два условия, которые меня смущают. Почему они логически эквивалентны?

while (!(c == 'Y' || c == 'y' || c == 'N' || c || 'n')); // Will run until c is the following
while (c !='Y' && c != 'y' && c != 'N' && c != 'n'); // Will also run but without being negated.

1 Ответ

0 голосов
/ 03 октября 2019

Эти логические выражения в циклах do-while

while (!(c == 'Y' || c == 'y' || c == 'N' || c || 'n')); // Will run until c is the following
while (c == 'Y' && c == 'y' && c == 'N' && c == 'n'); // Will also run but without being negated.

не эквивалентны.

Выражение

while (!(c == 'Y' || c == 'y' || c == 'N' || c || 'n'));

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

while ( c != 'Y' && c != 'y' && c != 'N' && !c && !'n' );

если у вас есть выражение, например, например

a == b || c == d

, то его отрицание

!( a == b || c == d )

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

!( a == b ) && !( c == d )

и, наконец,

a != b && c != d

Обратите внимание, что этот цикл do-while

char c;
do {
    cin >> c;
    cout << "You entered: " << c << "\n";
} while (c != 'Y' || c != 'y' || c != 'N' || c || 'n');

не имеет смысла. Например, если пользователь ввел 'N', тем не менее цикл продолжает свою итерацию, поскольку первое подвыражение c != 'Y' переходит в true.

...