C++连接错误

C++ Concatenation Oops

本文关键字:错误 连接 C++      更新时间:2023-10-16

所以我最近一直在从C++、C#和Java来回学习,并很好地编写了一些C++代码,我做了这样的事情。

string LongString = "Long String";
char firstChar = LongString.at(0);

然后尝试使用一种看起来像这样的方法,

void MethodA(string str)
{    
//some code    
cout << str;    
//some more code }

以下是我如何实现的。

MethodA("1. "+ firstChar );

尽管在C#和Java中完全有效,但这在C++中做了一些奇怪的事情。

我期待类似的东西

//1.L

但在程序的后面,它给了我一些其他字符串文字的一部分。

我到底做了什么?

我应该注意的是,我已经纠正了这个错误,这样它就打印出了我所期望的,但我真的对我错误地做了什么感兴趣。

提前谢谢。

C++没有将字符串文字上的加法定义为串联。相反,字符串文字衰减到指向其第一个元素的指针;单个字符被解释为数值,因此结果是从程序只读内存段中的一个位置到另一个位置的指针偏移。

使用std::string:将加法作为串联

MethodA(std::string() + "1. " + firstChar);
MethodA(std::string("1. ")+ firstChar );

自"1."是const-char[4]并且没有concat方法)

问题是"1. "是一个字符串文字(字符数组),它将衰减为指针。字符本身是可以提升为intchar,并且const char*int的相加被定义为通过将原始指针偏移那么多位置来计算新指针。

C++中的代码调用MethodA,结果是将(int)firstChar(字符的ASCII值)添加到字符串文字"1. "中,如果firstChar的值大于4(可能是),则这将是未定义的行为。

MethodA("1. "+ firstChar );  //your code

它是一种指针算术:它只向字符串文本"1. "的地址添加一个整数值(firstChar),然后将结果(char const*类型)传递给函数,在函数中转换为string类型。基于firstChar的值,它可以调用未定义的行为事实上,在您的情况下,它确实调用了未定义的行为,因为生成的指针指向字符串文字之外

写下:

MethodA(string("1. ")+ firstChar ); //my code

C++中的字符串文字不是std::string的实例,而是char s的常量数组。因此,通过向其添加char,一个隐式的强制转换为字符指针,然后按字符的数值递增,whick恰好指向存储在.data节中的另一个字符串文字。