关于**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。这与表达式是从左,还是从右开始被压栈有关。