c++ - 为什么 string::append 操作表现奇怪?

标签 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;
}

您期望的输出是什么?

你会像我一样期望它是:

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/

相关文章:

c - 在禁用优化的情况下进行编译时,为什么clang不使用内存目标x86指令?他们有效率吗?

c++ - 如何并行化使用某些变量的函数

c++ - 您多久声明一次函数为 const?

c++ - libboost ASIO。简单的异步客户端服务器

c++ - 解释一下C++中的链接(外部/内部)?

C++ volatile : guaranteed 32-bit accesses?

linux - $PWD 是否总是等于 ${${ :-. }:A}

c - 如何使用信号函数调用其他函数?

c++ - 在 GCC 中为类使用属性打包

c - 如何在c99标准下将x获取到C中的pow y