首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

关于*iter++的有关问题

2012-04-05 
关于**iter++的问题题目:编写程序定义一个vector对象,其中每个元素都是指向string类型的指针,读取该vector

关于**iter++的问题
题目:编写程序定义一个vector对象,其中每个元素都是指向string类型的指针,读取该vector对象,输出每个string的内容及其相应的长度。(C++ Primer 第四版特别版P142 5.6节 习题5.18)

C/C++ code
#include <iostream>#include <vector>#include <string>using namespace std;int main(){    vector<string*> spvec;    cout << "Enter strings(Ctrl+Z to end): " << endl;    //读取vector对象    string str;    while (cin >> str)    {        string *pstr = new string;        *pstr = str;        spvec.push_back(pstr);    }    // 输出每个string的内容及相应的长度    vector<string*>::iterator iter = spvec.begin();    while (iter != spvec.end())    {        cout << **iter << " size: " << (**iter).size() << endl;        ++iter;    }    // 释放申请的内存空间    iter = spvec.begin();    while (iter != spvec.end())    {        delete *iter++;    }    return 0;}

为什么把第二个while循环改成如下
C/C++ code
while (iter != spvec.end())    {        cout << **iter << " size: " << (**iter++).size() << endl;    }

编译没问题,但是运行的话,假如输入a b c d e 5个字符串,结果只输出b c d 和e,然后程序就会崩溃,请问原因是出在哪个地方呢?

[解决办法]
因此*iter++等效于*(iter++)

另外请参阅P148 5.10.3 求值顺序
C/C++ code
cout << **iter << " size: " << (**iter++).size() << endl;
[解决办法]
cout << **iter << " size: " << (**iter++).size() << endl;
运行时候发生程序发生崩溃,是因为上面这一条语句造成的,在该语句中,是先计算**iter 还是先计算
(**iter++).size(),在C++语言中没有规定,如果是先计算**iter,那么程序能够正确的输出,不会发生运行时的错误,如果是先计算(**iter++).size(),那么(**iter++).size()输出的是第一个字符串的长度,将其iter++的结果反应到后面的**iter输出,即**iter输出的是第二字符串的值,

而你运行时发生崩溃,说明是先计算的(**iter++).size()

再比如:int m=4;cout <<m++ << m;对于这个输出语句,则是先计算的m++,后计算的m,因此输出的是4和5
[解决办法]
cout << **iter << " size: " << (**iter++).size() << endl;
 和这句话执行顺序有关的;根据调试的结果看:编译器的执行顺序为:
先执行了(**iter++).size() 这句话,然后是**iter。这与表达式是从左,还是从右开始被压栈有关。

热点排行