C ++检查字符是否不在包含||的字符串中不工作

时间:2017-01-30 21:16:32

标签: c++ c++11

我正在开发这款游戏,让玩家再次被要求玩游戏。我习惯于检查是否满足条件然后返回false,所以最后我可以简单地添加return true。这也有助于嵌套。

如果我以相反的方式做到这一点:

bool AskToPlayAgain() {
    cout << "Do you want to play again? ";
    string Response = "";
    getline(cin, Response);

    if (Response[0] == 'y' || Response[0] == 'Y')
    {   
        cout << "True!\n";
        return true;
    }   

    cout << "False!\n";
    return false;
}

这将在y和Y上返回true,在其他每个字符上返回False。

然而。我想要它的方式是这样的:

if (Response[0] != 'y' || Response[0] != 'Y')
{   
    cout << "False!\n";
    return false;
}   

cout << "True!\n";
    return true;

只有,无论响应如何,它都将始终验证为false。这是为什么?我该如何解决?

4 个答案:

答案 0 :(得分:8)

如果反转两侧的条件,则还必须反转运算符。也就是说,Update workspace变为||,反之亦然。 (De Morgan's laws

考虑一下:&&只有一个值,所以它不能等于两个值,所以它必须总是不等于两个值中的一个。

答案 1 :(得分:4)

用简单的英语,你的代码在询问:

  

如果“响应”中的第一个字符不是“y”,,“响应”中的第一个字符不是“Y”,则此表达式为真。

这句话永远不会是假的。显然要么'不'或不'Y';它不能同时是两个值。两个不等式中的一个总是正确的,因此整个表达式也将是真实的。

你应该问的是:

  

如果“响应”中的第一个字符不是“y”,,则“响应”中的第一个字符也是“Y”以外的字符,此表达式为真。

其中,在C ++中,表示为:

if(Response[0] != 'y' && Response[0] != 'Y')

答案 2 :(得分:3)

想象一下Response[0] == 'y',在这种情况下Response[0] != 'Y'true。如果Response[0] == 'Y'条件Response[0] != 'y'变为true。因此,Response[0] != 'y' || Response[0] != 'Y'始终为true

答案 3 :(得分:1)

翻译为Boolean algebra并应用De Morgan's law

如果Response[0] == 'y'Response[0] == 'y'

然后是以下内容:

if (Response[0] == 'y' || Response[0] == 'Y')
    {   
        cout << "True!\n";
        return true;

可以正式写成(返回true

真相表:

      ∨ 
00      0 (not 'y' or 'Y')
01      1
10      1
11      1

及以下,(不等同于):

if (Response[0] != 'y' || Response[0] != 'Y')
{   
    cout << "False!\n";
    return false;

可以正式写成(回答是倒置的,返回false

¬(¬ ∨ ¬)

真值表(在此程序中始终为false):

     ¬(¬ ∨ ¬)
00      0 ok,  same as  ∨ 
01      0 not ok, differs from  ∨ 
10      0 not ok, differs from  ∨ 
11      1 ok, but will never happen, Response[0] cannot be both 'y' and 'Y'

现在,为了反转第一个陈述(),De Morgan的规则规定:

¬( ∨ ) ⇔ ¬ ∧ ¬

或等同于:

 ∨  ⇔ ¬(¬ ∧ ¬)

所以,写¬(¬ ∧ ¬)得到:

if (Response[0] != 'y' && Response[0] != 'Y')
{   
    cout << "False!\n";
    return false;

真相表:

     ¬(¬ ∧ ¬)
00      0 same as  ∨ 
01      1 same as  ∨ 
10      1 same as  ∨ 
11      1 same as  ∨