0

所以我最近一直在 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. 大号

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

我到底做了什么?

我应该注意我已经修复了这个错误,以便它打印出我所期望的,但我真的对我错误地做了什么感兴趣。

提前谢谢。

4

5 回答 5

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

因为“1.”是 const char[4] 并且没有 concat 方法)

于 2012-07-26T17:59:52.890 回答
3

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

要将添加作为连接,请使用std::string

MethodA(std::string() + "1. " + firstChar);
于 2012-07-26T18:00:29.237 回答
2
MethodA("1. "+ firstChar );  //your code

不做你想让它做的事情。它是一个指针算术:它只是将一个整数值(即firstChar)添加到 string-literal 的地址"1. ",然后将结果(char const*类型)传递给函数,在那里它转换为string类型。基于 的值firstChar,它可以调用未定义的行为。实际上,在您的情况下,它确实会调用未定义的行为,因为结果指针指向字符串文字之外。

写这个:

MethodA(string("1. ")+ firstChar ); //my code
于 2012-07-26T17:59:44.243 回答
2

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

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

于 2012-07-26T18:01:31.617 回答
1

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

于 2012-07-26T18:02:35.447 回答