gpt4 book ai didi

c++ - std::cout operator<< 的奇怪行为

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:05:51 25 4
gpt4 key购买 nike

我今天遇到了一些奇怪的事情,我想知道这里是否有人可以解释发生了什么......

这是一个示例:

#include <iostream>
#include <cassert>
using namespace std;

#define REQUIRE_STRING(s) assert(s != 0)
#define REQUIRE_STRING_LEN(s, n) assert(s != 0 || n == 0)

class String {
public:
String(const char *str, size_t len) : __data(__construct(str, len)), __len(len) {}
~String() { __destroy(__data); }

const char *toString() const {
return const_cast<const char *>(__data);
}

String &toUpper() {
REQUIRE_STRING_LEN(__data, __len);
char *it = __data;
while(it < __data + __len) {
if(*it >= 'a' && *it <= 'z')
*it -= 32;
++it;
}
return *this;
}

String &toLower() {
REQUIRE_STRING_LEN(__data, __len);
char *it = __data;
while(it < __data + __len) {
if(*it >= 'A' && *it <= 'Z')
*it += 32;
++it;
}
return *this;
}

private:
char *__data;
size_t __len;

protected:
static char *__construct(const char *str, size_t len) {
REQUIRE_STRING_LEN(str, len);
char *data = new char[len];
std::copy(str, str + len, data);
return data;
}

static void __destroy(char *data) {
REQUIRE_STRING(data);
delete[] data;
}
};

int main() {
String s("Hello world!", __builtin_strlen("Hello world!"));

cout << s.toLower().toString() << endl;
cout << s.toUpper().toString() << endl;

cout << s.toLower().toString() << endl << s.toUpper().toString() << endl;

return 0;
}

现在,我原以为输出是:

hello world!
HELLO WORLD!
hello world!
HELLO WORLD!

但我却得到了这个:

hello world!
HELLO WORLD!
hello world!
hello world!

我真的不明白为什么第二个 toUpper 没有任何效果。

最佳答案

这都是因为你的代码

cout << s.toLower().toString() << endl << s.toUpper().toString() << endl;

以及toLowertoUpper 是如何实现的。以下代码应按预期工作

cout << s.toLower().toString() << endl;
cout << s.toUpper().toString() << endl;

问题是 toLowertoUpper 不创建新对象而是修改现有对象。当您在同一 block 中调用多个修改方法并将该对象作为参数传递到某处时,行为是未定义的。

编辑:这类似于流行的问题,结果会是什么

int i = 5;
i += ++i + i++;

这里的正确答案是一样的:未定义。您可以在 C++ 中搜索“序列点”以获得更深入的解释。

关于c++ - std::cout operator<< 的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2693079/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com