在循环条件中使用逻辑运算符

Use of Logical Operator in Loop Condition

在下面给出的代码中,为什么 || 逻辑不起作用,而是在使用 && 时循环终止?

int main() {
    char select {};
    do {
        cout<<"Continue the loop or else quit ? (Y/Q): ";
        cin>>select;
    } while (select != 'q' && select != 'Q'); // <--- why || (or) doesn't work here ??
    return 0;
}

select 不是 q 并且 不是 Q:

时,这个循环将继续
while (select != 'q' && select != 'Q'); 

select 不是 q 不是 Q 时,此循环将继续。

while (select != 'q' || select != 'Q'); 

因为其中之一必须为真,所以它会永远持续下去。

示例:

  1. 用户输入q

select != 'q' 的计算结果为 false
select != 'Q' 的计算结果为 true
false || true 的计算结果为 true

  1. 用户输入Q

select != 'q' 的计算结果为 true
select != 'Q' 的计算结果为 false
true || false 的计算结果为 true

您想在 select 等于 'q''Q' 时终止循环。

相反的条件可以写成

do {
    cout<<"Continue the loop or else quit ? (Y/Q): ";
    cin>>select;
} while ( not ( select == 'q' || select == 'Q' ) );

如果打开括号那么你会得到

do {
    cout<<"Continue the loop or else quit ? (Y/Q): ";
    cin>>select;
} while ( not( select == 'q' ) && not ( select == 'Q' ) );

反过来相当于

do {
    cout<<"Continue the loop or else quit ? (Y/Q): ";
    cin>>select;
} while ( select != 'q' && select != 'Q' );

考虑以下图表:

全椭圆都是字符。白点分别是 qQ。黑色填充区域描绘了将构成表达式 true 的字符。第一行是 select != 'q' && select != 'Q',第二行是 select != 'q' || select != 'Q'

&&表示两个条件都必须是true。由此产生的黑色区域是左侧两个区域的重叠。

||表示其中一个条件必须是true。得到的黑色区域是左边两个区域的总和。