当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《任何人都能解释这个简单逻辑背后的逻辑吗?我迷路了》经验,为你挑选了1个好方法。

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

// do while
#include
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;
}

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



1> Holt..:

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

A && B

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

所以在:

input != password && cout << "wrong password" << endl

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()`将执行非内置类型的短路.
@FrançoisAndrieux:实际上,如果`&&`是*重载*,它就不再适用了.
推荐阅读
重庆制造漫画社
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有