Эти логические выражения в циклах 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.