看下面的简单代码:
#include <iostream>
#include <string>
using namespace std;
int main()
{
string s("1234567890");
string::iterator i1 = s.begin();
string::iterator i2 = s.begin();
string s1, s2;
s1.append(i1, ++i1);
s2.append(++i2, s.end());
cout << s1 << endl;
cout << s2 << endl;
}
您期望的输出是什么?
你会像我一样期望它是:
1
234567890
错了! 它是:
234567890
即第一个字符串为空。
前缀增量运算符的接缝对于迭代器来说是有问题的。或者我错过了什么?
最佳答案
你错过了一些东西:这确实与迭代器无关。函数参数的求值顺序是未指定的。因此,您的: append(i1,++i1);
将取决于未指定的行为,无论 i1
的类型如何。举个例子,给出一些更简单的东西,比如:
void print(int a, int b) {
std::cout << a << " " << b << "\n";
}
int main() {
int a =0;
print(a, ++a);
return 0;
}
您的输出可以完全合理地是您似乎期望的“0 1”,但也可以完全合理地是:“1 1”。由于这是未指定的,它可能会从一个版本的编译器更改为下一个版本,甚至当您更改标志时使用相同的编译器,或者(理论上)可能会根据月相而变化......
关于c++ - 为什么 string::append 操作表现奇怪?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2231111/