dav*_*vka -3 c++ linux gcc stl operator-precedence
看看下面的简单代码:
#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;
}
Run Code Online (Sandbox Code Playgroud)
您对输出的期望是什么?
你会像我一样期望它是:
1
234567890
Run Code Online (Sandbox Code Playgroud)
错误!它是:
234567890
Run Code Online (Sandbox Code Playgroud)
即第一个字符串为空.
前缀增量运算符的接缝在迭代器中存在问题.还是我错过了什么?
Jer*_*fin 14
你错过了一些东西:这与迭代器无关.未指定评估函数的参数的顺序.因此,您的: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;
}
Run Code Online (Sandbox Code Playgroud)
您的输出可能完全合理地是您期望的"0 1",但它也可以完全合理地为:"1 1".由于这是未指定的,它可能会从编译器的一个版本更改为下一个版本,或者甚至在更改标志时使用相同的编译器,或者(理论上)可能会根据月亮的相位而变化...
| 归档时间: |
|
| 查看次数: |
278 次 |
| 最近记录: |