这是在c++中运行循环的有效方式吗?

Would this be a valid way of running a loop in c++?

本文关键字:有效 方式吗 循环 运行 c++      更新时间:2023-10-16

如果我想有一个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'转换为bool来求表达式('a' || 'b' || 'c');实际上,这里只对第一个操作数 ('a')求值,因为它的求值产生true,并保证整个表达式('a' || 'b' || 'c')也求值为true——应用了短路。

初始循环的作用是:

while (uInput != true)
{
    //do something to make it equal one of those
}

这不是你想要的

No.

这是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++中,只能得到这种愚蠢的语法,但是如果你真的想要,你可以将这些选项放在容器中(比如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'

将始终求值为true,即使uInput等于其中一个值,使循环成为无限循环。