我正在开发这款游戏,让玩家再次被要求玩游戏。我习惯于检查是否满足条件然后返回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。这是为什么?我该如何解决?
答案 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)
如果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 ∨