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

时间:2013-04-14 17:46:35

标签: c++ loops syntax while-loop

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

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

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

4 个答案:

答案 0 :(得分:5)

它没有做你想做的事。您需要单独比较每个值:

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

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

uInput != true

答案 1 :(得分:3)

即可。你想写的是:

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

表达式('a' || 'b' || 'c')将通过转换字符'a''b''c'进行评估bool;实际上,只有第一个操作数'a')在这里被评估,因为它的评估产生值true并保证整个表达式('a' || 'b' || 'c')的计算结果为{{1同样 - 应用短路。

所以你的初始循环是:

true

这不太可能是你想要的。

答案 2 :(得分: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 ++中,获取愚蠢的语法,但如果您真的想要,可以将这些选项放在容器(例如std::vector)中并使用诸如{之类的算法{1}}:

std::find

当然,当你想要做的就是写:

std::vector<char> v{'a', 'b', 'c'};
while (std::find(uInput, v.begin(), v.end()) != v.end()) {
  // ...
}

答案 3 :(得分:1)

正确的答案是

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

因为条件

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

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

你真的需要阅读有关C ++语法的内容。