c++ - 附加 Char 改变其大小后的字符串

标签 c++

我想测试如果字符串追加字符的大小会怎样,下面是结果。

我知道字符串以空字符结尾,但为什么结果是这样呢?

#include <iostream>
#include <string>
using namespace std;
int main(){
    string a = "" + 'a';    //3
    string b = "" + '1';    //2
    string c = "a" + 'a';   //2
    string d = "1" + '1';   //3
    string e = "\0" + 'a';  //20
    string f = "\0" + '1';  //1
    string g = "a" + '\0';  //1
    string h = "1" + '\0';  //1
    string i = "" + '\0';   //0
    string j = "" + '\0';   //0
    cout << a.size() << endl;
    cout << b.size() << endl;
    cout << c.size() << endl;
    cout << d.size() << endl;
    cout << e.size() << endl;
    cout << f.size() << endl;
    cout << g.size() << endl;
    cout << h.size() << endl;
    cout << i.size() << endl;
    cout << j.size() << endl;
    return 0;
}

最佳答案

您的代码没有按您的想法行事。

字符串字面量衰减为const char *,而char是整数类型。如果您尝试对它们求和,编译器会发现理解这些内容的最简单方法是将 char 转换为 int,因此结果是执行指针运算在字符串文字上 - 例如""+'a' 转到内存中字符串文字开始后的第 97 个字符 ""(如果 'a' 表示97 在您的平台上)。

这导致垃圾被传递给 string 构造函数,它将存储在正在构造的 string 中,无论它在内存的这些位置找到什么,直到它找到一个 \0 终止符。因此,您会得到“奇怪”的结果(不可重现,因为字符串表的确切内存布局取决于编译器)。

当然,就标准而言,所有这些都是未定义的行为(除了添加 \0 的情况外,您正在访问 char 数组的范围).

为了使您的代码按照您的意思执行,至少有一个操作数必须是 string 类型:

string c = string("a") + 'a';

string c = "a" + string("a");

因此编译器将看到涉及 std::stringoperator+ 的相关重载。

关于c++ - 附加 Char 改变其大小后的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13808152/

相关文章:

c++ - CMake:覆盖由 target_link_libraries 添加的库

c++ - 裁剪给定角度的图像

java - 构建/新关键字的更好方法

java - JNI 返回 Java 对象,返回本地引用可以吗,还是必须是全局的?

C++ protected 构造函数对派生类中的成员不可用

python - 如何在 SWIG 中将 vector 的锯齿状 C++ vector 转换(类型映射)为 Python

c++ - QListWidget 中的 setSelectionModel 停止发射 itemSelectionChanged 信号

c++ - 排列序列的计算

c++ - 内部类模板的非成员运算符重载

c++ - CMake 目标链接库 "Could NOT find GLUT (missing: GLUT_glut_LIBRARY)"