任何人都能解释这个简单逻辑背后的逻辑吗?我迷路了

Eug*_*sai 3 c++ logic do-while

我只是尝试在C++中使用do while循环,而我想出了在do while循环中执行多项操作之后的括号内的描述或其他任何内容的描述.所以这是我最初的逻辑:我已经设置了password变量和input变量.如果两个东西匹配,那么它将退出循环并输出"正确的密码",否则它会继续回到循环,输出"错误的密码",所以它继续.这是我的代码:

// do while
#include<iostream>
using namespace std;
int main(){
    int input, password=19960819;
    do{
        cout << "Type your password:" ;
        cin >> input;
    }while(input!=password && cout << "wrong password" << endl); 
    cout << "correct password" << endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我期待即使我输入了正确的答案,我仍然会输出"错误的密码".我认为那个cout << "wrong password" << endl部分总是会返回true,无论如何都应该执行,唯一的因素就是input!=password部分.然而,结果实际上是完美的,这不是我所期待的......任何人都可以解释逻辑吗?我正在挑战自己不使用if或其他逻辑,而只是使用do while逻辑来达到这个结果,但我不明白为什么它现在正在工作...

Hol*_*olt 12

C++ 对内置的1个布尔运算符使用短路评估,这意味着当你这样做时:

A && B
Run Code Online (Sandbox Code Playgroud)

B仅当被评估Atrue,因为如果Afalse,整个表达式是false(无论的值B).

所以在:

input != password && cout << "wrong password" << endl
Run Code Online (Sandbox Code Playgroud)

input != passwordfalse(当你输入正确的密码),第二个操作数cout << "wrong password" << endl不评估,因此没有什么outputed.


关于条件评估的额外细节:

  • 类型input != passwordbool;
  • 类型cout << "..." << endlstd::ostream&;
  • std::ostream可转换为bool直接(因为C++ 11)或使用转化为void*(C++ 03).

由于没有operator&&(bool, [const] std::ostream&)并且std::ostream可以转换,因此这里使用bool内置operator&&(bool, bool),因此短路评估适用2.

input != passwordtrue(您输入的密码错误),cout << "..." << endl进行评价时,再转换为一个bool数值,其将通过true大部分时间3,因此允许环以继续.

input != passwordfalse,短路防止cout << "..." << endl从被评估,并没有什么被发送到输出端.

1对于过载的操作员,短路评估不再适用.请参见http://en.cppreference.com/w/cpp/language/operator_logical.

2您可以&&在之前添加用户定义的重载main,例如bool operator&&(bool b, std::ostream &s) { return b && (bool)s; },查看该短路仅适用于内置运算符.

3有没有保证,这将返回true,因为流可能是处于故障状态,但这是不可能std::cout.

  • @CaptainGiraffe你可以有一个内置类型,例如`A`,可转换为`bool`,因此`A()&& A()`将执行非内置类型的短路. (4认同)
  • @FrançoisAndrieux:实际上,如果`&&`是*重载*,它就不再适用了. (3认同)