c++迭代器停留在第一个值
c++ iterator stuck at first value
我正在学习c++,遇到了一些无法解释的行为。下面的两段代码提供了不同的结果,而我希望它们是等效的:
success = true;
vector<instruction>::const_iterator i;
for (i = instructions.begin(); i != instructions.end(); ++i) {
bool up = update(*i);
success = success && up;
}
和
success = true;
vector<instruction>::const_iterator i;
for (i = instructions.begin(); i != instructions.end(); ++i) {
success = success && update(*i);
}
我的印象是,第二个版本总是采用迭代器的初始值。有人能解释一下原因吗?
这两段代码并不等价。
第一个总是调用update
,而第二个则不会。原因是&&
做了一种叫做short-circuit boolean evaluation
的事情。如果success
为false,则不计算表达式的后半部分。
请注意,您没有发布update
是什么或返回了什么。因此,我们只能假设能够从update
返回什么,它将是true
或false
。
如果希望始终调用update
,则应将其放在&&
表达式的第一位。
如果结果仅使用左手边值即可计算,则运算符&&
将不会计算右手边。我们称之为短路。
一旦success
是false
,就不再调用update(*i)
。
除了第一个代码块(它总是调用update(*i)
)之外,一个修复方法是使用运算符&
,它总是计算两个参数。另一个解决方案是写入
success = update(*i) && success;
但这很容易受到难以抗拒的重构的影响。更好的是,使用
success &= update(*i);
但请注意@Angew:的评论
在布尔上下文中使用&=
是危险的。如果update
现在(或在未来的重构之后)返回一个语义为"非零为真"的int
(参见isdigit
和friends),该怎么办?请记住,bool(true & 2)
就是false
。
相关文章:
- 获取向量C++中第一个值和最后一个值的和
- 有没有一种"cleaner"的方法可以在指向基的指针向量中找到派生类的第一个实例?
- 当我在第一个循环中使用"auto"时,它工作正常,但是使用"int"它会给出错误,为什么?
- 我有两个类需要在同一 cpp 文件中相互引用,但第一个类无法识别第二个类类型的对象
- 为什么有时我输入一个整数,程序将第一个输入的数字打印成十进制数?
- 如何在创建自定义迭代器时获得 std::p air 的第一个和第二个?
- 如何实现 Front() 方法以返回模板化双向链表C++的第一个元素?
- WinAPI 在单击第一个对话框上的按钮控件并销毁第一个对话框后创建第二个对话框
- 查找数组中第一个最小值和最后一个最大值元素之间的算术平均值
- "main"函数堆栈中的对象在第一个任务运行时被覆盖 (FreeRTOS)
- 对的排序向量 (std::vector<pair<int, int>>) 按对的第一个元素搜索并更新第二个元素值
- C++部分概念 id:显式模板规范顺序/第一个参数的特殊状态的原因是什么?
- 比较 2 个向量并从第二个向量中删除在第一个 - c++ 中找不到的元素
- 为什么当我尝试搜索双链表中第一个数据条目之外的数据时,程序崩溃了?
- 使第二个类的构造函数成为第一个类中的友元函数
- 为什么第二个代码给出了预期的结果,而第一个代码却没有?
- 使用哈希图打印第一个重复元素;
- 配方在第一个目标之前开始.停.运行生成文件时
- 素数程序停在20,031的第一个素数,225,149,没有明显的原因。无错误消息
- OpenGL的第二个窗口在第一个窗口停用土壤纹理