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

时间:2017-01-10 14:25:34

标签: 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;
}

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

3 个答案:

答案 0 :(得分:12)

C ++对内置的 1 布尔运算符使用short-circuit evaluation,这意味着当你这样做时:

A && B
仅当BA时才会评估

true,因为如果Afalse,则整个表达式为false(无论价值B)。

所以:

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

input != passwordfalse时(当您输入正确的密码时),第二个操作数cout << "wrong password" << endl未被评估,因此没有任何内容被输出。

评估条件的额外细节:

  • input != password的类型为bool;
  • cout << "..." << endl的类型为std::ostream&;
  • std::ostreamconvertible to 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,因为流可能处于失败状态,但不太可能 { {1}}。

答案 1 :(得分:2)

cout << "wrong password" << endl始终评估为true(通过转换为bool运算符),并且具有输出该文本的副作用。

但由于input != password的短暂性质,仅在&&进行评估。

真的很可爱。就个人而言,我会写

} while (input != password && std::cout << "wrong password\n");

请注意,这依赖于std::basic_ios::operator bool,它已从C ++ 11中巧妙地改变了。见http://en.cppreference.com/w/cpp/io/basic_ios/operator_bool。在许多方面,最好避免像这样的华而不实的代码。

答案 2 :(得分:1)

这是因为&amp;&amp;和||被评估为短路。因此,例如,A&amp;&amp;如果A和B都是(并且只有两者)都为真,B将评估为真,但是(并且这里是短路)如果A或B为假则为假,因此当A为假时,无需评估乙

在您的方案中,当comparaisson输入!=密码&#39;是假的(即输入==密码),它停止评估表达式。

希望这会有所帮助:)

抱歉我的英文。