简体   繁体   中英

Use of Logical Operator in Loop Condition

In the below given code, why the || logical doesn't work, instead the loop terminates specifically when && is used ?

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;
}

This loop will go on while select is not q and it's not Q :

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

This loop will go on while select is not q or it's not Q .

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

Since one of them must be true, it'll go on forever.

Examples:

  1. The user inputs q

select != 'q' evaluates to false
select != 'Q' evaluates to true
false || true false || true evaluates to true

  1. The user inputs Q

select != 'q' evaluates to true
select != 'Q' evaluates to false
true || false true || false evaluates to true

You want to terminate the loop when select is equal either to 'q' or 'Q' .

The opposite condition can be written like

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

If to open the parentheses then you will get

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

that in turn is equivalent to

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

Consider the following diagrams:

在此处输入图片说明

The full ellipse are all characters. The white dots is q and Q respectively. The black filled area depicts characters that will make the expression true . First line is select != 'q' && select != 'Q' , second line is select != 'q' || select != 'Q' select != 'q' || select != 'Q' .

&& means both conditions must be true . The resulting black area is the overlap of the two areas on the left.

|| means either of the conditions must be true . The resulting black area is the sum of the two areas on the left.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM