在while循环中调用布尔函数

时间:2019-03-28 17:30:28

标签: c++ visual-c++

我有一个bool函数,其中包含if else语句。第一个“ if”返回“ false”,其他则返回“ true”。我想在另一个带有while循环的函数中调用此布尔函数。我已经尝试了几次,并且使它起作用。但是,当我调用该函数时,它始终会返回“ true”。我该如何解决?

bool secretCheck(string P1_name, string P2_name, char secret){
    secret =  'R', 'G', 'B', 'P', 'Y', 'M';
    if (secret != 'R' && secret != 'G' && secret != 'B' && secret != 'P' && secret != 'Y' && secret != 'M' && secret > 4){
        return false;   
    }
    else {
        return true;
    }
}

void secretLoop(string P1_name, string P2_name, char secret){
    while(!secretCheck(P1_name, P2_name, secret)){
        cout << "Invalid secret!"<< endl;
        cout << P1_name << ", please enter your secret: ";
        cin >> secret;
    }

    if(secretCheck(P1_name, P2_name, secret)) {
        cout << "Ok\n";
    }
}

2 个答案:

答案 0 :(得分:1)

我不确定您要使用此行做什么:

secret =  'R', 'G', 'B', 'P', 'Y', 'M';

一个字符可以保留一个一个值。在这种情况下,您使用的是逗号运算符,该运算符将删除第一个值并返回第二个表达式。

在那一行,secret总是 等于'R',因为它等同于说:

secret = 'R'; // now secret is equal to the character 'R'

然后,在您的if语句中,您明白了:

secret != 'R' && /* ... */

由于secret始终等于'R',因此这始终是错误的。

然后,有一个比较大的比较:

secret > 4

这也是事实,因为比较charint将比较字符的ASCII值。


要在一个变量中存储多个字符,其类型必须为std::stringstd::vector

std::vector<char> secret_characters = {'R', 'G', 'B', 'P', 'Y', 'M'};

如果要检查secret是否在secret_character列表中,可以执行以下操作:

void is_secret(std::vector<char> const& secret_characters, char secret) {
    auto found = std::find(
        secret_characters.begin(), secret_characters.end(),
        secret
    );
    return found != secret_characters.end();
}

bool secretCheck(string P1_name, string P2_name, char secret){
    std::vector<char> secret_characters = {'R', 'G', 'B', 'P', 'Y', 'M'};
    if (is_secret(secret_characters, secret)) {
        return false;   
    } else {
        return true;
    }
}

答案 1 :(得分:0)

在函数secretCheck中,您将值'R'分配给secret,完全覆盖了以前的值。然后,如果false返回secret != 'R'。因此,您将永远不会返回false,因为secret总是 'R'。目前尚不清楚您要在该函数的第一行中尝试执行的操作,尤其是由于该函数的含义尚不清楚(您甚至从未使用过任何一个字符串参数)。我建议确保您的功能确实在执行您想要的任务。