如果我想有一个while循环:虽然一个变量不等于几个不同的值,这有效吗?:
while (uInput != ('a' || 'b' || 'c')){
//do something to make it equal one of those
}
或者我是否必须单独将 uInput 与 a 进行比较,将 uInput 与 b 进行比较,等等?
如果我想有一个while循环:虽然一个变量不等于几个不同的值,这有效吗?:
while (uInput != ('a' || 'b' || 'c')){
//do something to make it equal one of those
}
或者我是否必须单独将 uInput 与 a 进行比较,将 uInput 与 b 进行比较,等等?
它不会做你想让它做的事情。您需要单独比较每个值:
uInput != 'a' && uInput != 'b' && uInput != 'c'
实际上,('a' || 'b' || 'c')
将被评估为true
并且表达式等效于:
uInput != true
没有。你想写的是:
while ((uInput != 'a') && (uInput != 'b') && (uInput != 'c'))
{
//do something to make it equal one of those
}
表达式('a' || 'b' || 'c')
将通过转换字符'a'
,'b'
和'c'
too来计算bool
;实际上,这里只有第一个操作数( 'a'
) 被求值,因为它的求值会产生值true
并保证整个表达式也('a' || 'b' || 'c')
求值true
- 应用了短路。
所以你的初始循环所做的是:
while (uInput != true)
{
//do something to make it equal one of those
}
这不太可能是您想要的。
这会是在 C++ 中运行循环的有效方法吗?
它是“有效的”,但它并没有做你想做的事情。与我不同,编译器不会神奇地推断出您的意图,因为它与语言的语义不同。
运算符是愚蠢的!=
,因为它不在乎你试图在它的右手边做什么有趣的魔法——右手边表达式的结果是被比较的结果,结果是('a' || 'b' || 'c')
只是一个值,即不是您想要的选项列表。
某些语言提供了允许您使用这些语义的替代运算符,例如在 SQL 中:
SELECT * FROM tbl WHERE NOT value IN ('a', 'b', 'c')
-- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
但即使在 SQL 中,基本的不等式运算符也不关心列表:
SELECT * FROM tbl WHERE value != ('a', 'b', 'c')
-- probably a syntax error, or otherwise failure to do what you wanted
在 C++ 中,您只能获得愚蠢的语法,但如果您真的想要,您可以将这些选项放在容器中(例如 an std::vector
)并使用以下算法std::find
:
std::vector<char> v{'a', 'b', 'c'};
while (std::find(uInput, v.begin(), v.end()) != v.end()) {
// ...
}
当然,当您只想编写以下代码时,这太过分了:
while (uInput != 'a' && uInput != 'b' && uInput != 'c')
正确答案是
while (uInput != 'a' && uInput != 'b' && uInput != 'c')
因为条件
uInput != 'a' || uInput != 'b' || uInput != 'c'
将始终评估为真,即使 uInput 等于其中一个值,使您的循环成为无限循环。
你真的需要阅读 C++ 语法。