0932213

练习9.32:

在第316页的程序中,像下面语句这样调用insert是否合法?如果不合法,为什么?

iter = vi.insert(iter, *iter++);

【出题思路】

本题复习实参与形参的关系,进一步熟悉迭代器的处理对容器操作的关键作用。

【解答】

很多编译器(例如作者所使用的tdm-gcc)对实参求值、向形参传递的处理顺序是由右至左的。这意味着,编译器在编译上述代码时,首先对*iter++求值,传递给insert第二个形参,此时iter己指向当前奇数的下一个元素,因此传递给insert的第一个参数的迭代器指向的是错误位置,程序执行会发生混乱,最终崩溃。

因此,若将代码改为iter = vi . insert (iter+ + , *iter);,或是使用左至右求值、传递参数的编译器,代码的运行结果是正确的。当然,这样的代码在逻辑上是毫无道理的。

本页共13段,588个字符,1125 Byte(字节)