如果我想要一个while循环:虽然变量不等于几个不同的值,这是否有效?:
while (uInput != ('a' || 'b' || 'c')){
//do something to make it equal one of those
}
或者我是否必须单独将uInput与a,uInput与b进行比较,依此类推?
答案 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 ++语法的内容。