-3

如果我想有一个while循环:虽然一个变量不等于几个不同的值,这有效吗?:

while (uInput != ('a' || 'b' || 'c')){
    //do something to make it equal one of those
}

或者我是否必须单独将 uInput 与 a 进行比较,将 uInput 与 b 进行比较,等等?

4

4 回答 4

5

它不会做你想让它做的事情。您需要单独比较每个值:

uInput != 'a' && uInput != 'b' && uInput != 'c'

实际上,('a' || 'b' || 'c')将被评估为true并且表达式等效于:

uInput != true
于 2013-04-14T17:47:27.707 回答
3

没有。你想写的是:

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
}

这不太可能是您想要的。

于 2013-04-14T17:47:38.293 回答
3

不。

这会是在 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')
于 2013-04-14T17:55:31.360 回答
1

正确答案是

while (uInput != 'a' && uInput != 'b' && uInput != 'c')

因为条件

uInput != 'a' || uInput != 'b' || uInput != 'c'

将始终评估为真,即使 uInput 等于其中一个值,使您的循环成为无限循环。

你真的需要阅读 C++ 语法。

于 2013-04-14T17:49:45.170 回答