这是在c++中运行循环的有效方式吗?
Would this be a valid way of running a loop in c++?
如果我想有一个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等于其中一个值,使循环成为无限循环。
相关文章:
- 分配新的零大小数组可以具有有效价值吗?
- 编译器会秘密增加结构的对齐方式吗?
- std::shared_ptr<std::string const> 可以作为引用计数的不可变字符串的有效实现吗?
- 我正在写一个非常简单的字母评分系统,if语句是最有效的吗?
- 确定范围是访问虚拟功能的合法方式吗?
- 有什么优雅的方式吗?(类型参数包)
- 这是删除整个链表的有效方法吗?
- 这是缩小数组的有效方法吗?
- "defau1t:"(不是"default:")是标签的有效值吗?
- 这是从 std::vector 中删除项目的有效方法吗?
- 可以存储参数化类的所有有效实例吗?
- std::unique_ptr的自定义deleter是手动调用析构函数的有效位置吗
- Qt:对于生产者-消费者模式中的消费者来说,这是正确的退出方式吗
- 无论CRT版本如何,这都是在库中提供STL函数的有效方法吗
- 常量标识符在C++中有不同的处理方式吗
- reinterpret_cast<char *> 是reinterpret_cast的唯一有效用法吗?
- C ++变量赋值,这是正常的方式吗
- 有清除类型的快捷方式吗
- 持有多个特征矩阵Xd的最有效方式
- 这是在c++中运行循环的有效方式吗?