今天做《C++ Primer(第四版)》的习题 4.8,发现了配套题解书该题答案的一点小问题。
是关于原题第二问的,判断两个vector是否相等。
习题解答中给出的答案为:





















































不知道是不是编译器原因,在我的VC+ 2005中编译能通过,但是运行时如果输入的两个vextor相等时程序会发生异常中断。如图:
刚开始百思不得其解,最后单步半天,终于将错误原因定位到了这一句代码上

因为在 VC++ 2005 中对 && 符号的运算顺序是自左至右,这句话是先判断 *iter1==*iter2,再判断 iter1 != ivec1.end() ,最后判断 iter2 != ivec2.end()。当然这三步有一步不成立,则while循环就会终止了。
问题就出在这里,当输入的 ivec1 和 ivec2 的内容相等时,比如都是 1 2 3 时,在执行到 while 循环时,依次比较 ivec1 和 ivec2 的对应数值是否相等,如果相等的话,则迭代器 iter1 和 iter2 都做一次自增运算++。关键是当比较完第三个数字 3 后,iter1 和 iter2 都分别指向了容器的末端元素的下一个位置,即 iter1=ivec1.end(), iter2=ivec2.end(),此时程序返回到 while 循环条件继续判断,先做判断 *iter1==*iter2,因为此时 iter1 和iter2 都不指向两个容器中任何元素,执行这个判断肯定要出错了。怪不得程序运行到这里时,系统“咚”的一声就弹出了一个错误对话框。害我调试了半天。
其实解决起来倒是简单,一是把 while 循环条件中的 *iter1==*iter2 写到最后,

二是把 while 语句改为for语句

if(*iter1==*iter2)
{
++iter1;
++iter2;
}
不过改完后细想,这个题还是用for循环最为稳妥,因为用while循环,即使改了循环条件几个语句的顺序,但是换到另外的编译器里,如果 && 的运算顺序是自右至左的话,还是会出错。因此用for是最把握的了。
看来写代码时这些细节东西还是要注意的。