关于**iter++的问题
题目:编写程序定义一个vector对象,其中每个元素都是指向string类型的指针,读取该vector对象,输出每个string的内容及其相应的长度。(C++ Primer 第四版特别版P142 5.6节 习题5.18)
#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 (iter != spvec.end()) { cout << **iter << " size: " << (**iter++).size() << endl; }
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。这与表达式是从左,还是从右开始被压栈有关。