和表现得像OR?

时间:2013-12-30 08:53:56

标签: c++

我正在评估输入并将其结果(由空格分隔)分配给两个变量。不幸的是,如果用户==“用户”或密码==“通过”,它似乎打破了循环!

    #include <iostream>
    #include <string>

    using namespace std;

    int main()
    {
        string username;
        string password;
        do {
            cout<<"Please enter the correct username and password.\n";
            cin>>username>>password;
            cin.ignore();
        } while (username != "user" && password != "pass");
        cout<<"username and password correct";
    }

4 个答案:

答案 0 :(得分:8)

你真的需要一个OR:

while (username != "user" || password != "pass");

这不是C ++问题,而是布尔逻辑问题。例如,请参阅De Morgan's laws

答案 1 :(得分:4)

为了理解你的错误,现在是时候看看De-Morgan's法律:

  

“not(A或B)”与“(不是A)和(不是B)”

相同

所以你的代码就像写作:

!(username == "user" || password == "pass")

答案 2 :(得分:3)

只要while关键字后面指定的条件为true,do..while循环就会继续执行。只要username != "user" password != "pass",您就希望循环继续。

我们现在假设username == "user"password == "abc"。然后将满足条件的第一部分,但第二部分不会。所以你的循环将结束。

您真正想做的是在username != "user" password != "pass"期间继续循环。您可以通过以下方式编写它:

(...)
while (username != "user" || password != "pass");

或者,更清楚一点:

while (!(username == "user" && pass == "pass"));

答案 3 :(得分:-2)

#include <iostream>
#include <string>

using namespace std;

int main()
{
    string username;
    string password;
    label:
    cout<<"Please enter the correct username and password.\n";
    cin>>username>>password;
    cin.ignore();
    if((username != "user") || (password != "pass"))
        goto label;
    cout<<"username and password correct";
}