![](/img/trans.png)
[英]C++: Checking whether a string character is a digit using isdigit. .
[英]C++ Checking if a character is not in a string with || not working
我正在开发这个游戏,要求玩家再次玩。 我习惯于检查条件是否不满足然后返回 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。 这是为什么? 我该如何解决?
如果你反转两边的条件,你也必须反转运算符。 也就是说, ||
变成&&
,反之亦然。 (德摩根定律)
想一想: Response[0]
只有一个值,所以它不可能等于两个值,所以它必须始终不等于两个值之一。
用简单的英语,您的代码要求:
如果“Response”中的第一个字符不是“y”,或者“Response”中的第一个字符不是“Y”,则此表达式为真。
这个说法永远不可能是假的。 显然不是“y”或不是“Y”; 它不能同时是两个值。 两个不等式之一将始终为真,因此整个表达式也将始终为真。
你应该问的是:
如果“Response”中的第一个字符不是“y”,并且“Response”中的第一个字符也不是“Y”,则此表达式为真。
其中,在 C++ 中,表示为:
if(Response[0] != 'y' && Response[0] != 'Y')
想象一下Response[0] == 'y'
,在这种情况下Response[0] != 'Y'
是true
。 如果Response[0] == 'Y'
条件Response[0] != 'y'
变为true
。 所以你的Response[0] != 'y' || Response[0] != 'Y'
Response[0] != 'y' || Response[0] != 'Y'
始终为true
。
如果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
)
¬(¬𝑨 ∨ ¬𝑩)
真值表(在这个程序中总是假的):
𝑨𝑩 ¬(¬𝑨 ∨ ¬𝑩)
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'
现在,为了反转第一个陈述 ( 𝑨 ∨ 𝑩
),德摩根法则规定:
¬(𝑨 ∨ 𝑩) ⇔ ¬𝑨 ∧ ¬𝑩
或者,等效地:
𝑨 ∨ 𝑩 ⇔ ¬(¬𝑨 ∧ ¬𝑩)
所以,写¬(¬𝑨 ∧ ¬𝑩)
我们得到:
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 𝑨 ∨ 𝑩
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.