一个简单的C++程序,改变while循环的进入条件顺序后运行出错。

void func(forward_list &lst, string s1, string s2)
{
auto current = lst.begin();
auto prev = lst.begin();
cout << *prev << endl;
while (*current != s1 && current != lst.end())
{
prev = current++;
cout << *prev << endl;
}
if (current != lst.end())
lst.insert_after(current, s2);
else
lst._Insert_after(prev, s2);
}
上面这个程序的第二种情况不能正常运行,会出现foward_list iterator not incompa-tible的提示。但如果我像下面这样将while的条件顺序交换一下,则程序第二种情况能正确运行。我问了我的C语言老师,但他没能给出答案。
while (current != lst.end() && *current != s1)

短路问题呀,c++对于&&判断是有短路的

 current != lst.end() &&   这个条件里,如果current != lst.end()已经到末尾了,那就是false,后面就不取值判断了。
 如果是
 *current != s1&&current != lst.end()的话,如果已经到末尾了,先取值再判断是否到末尾,就报错了。

谢谢。我对一个空迭代器取了值,学到了。。。

&&判断存在短路问题~
因为高级语言比如C、C++会最终通过编译器和汇编器转换成机器指令~
而编译器会根据逻辑关系优化指令,比如这里的“&&”连接的两条C语言条件判断也会转化成顺序执行的两条cmp机器指令~编译器会根据逻辑与的特点,优化后的指令是:其中有一个条件判断出错都会不在顺序进行(无用的)其他判断~
这样current != lst.end() && *current != s1:逻辑合理,先判断是否是合法界限,然后判断合理界限的数据是否是要查找的值;
而 *current != s1 && current != lst.end(): 逻辑是先取值判断是否是查找值,再判断所取值是否是在合法界限内~
这样当数据处于越界的状态current != lst.end() && *current != s1会在第一个判断停止,不再进行下面的判断~从而不会从非法位置取值~而current != lst.end() && *current != s1会先从非法位置取值,从而产生运行错误~