C++:将字符串字面值添加到字符字面值

10

我有一个关于C++中字符串拼接的问题。

string str = "ab" + 'c';
cout << str << endl;

char ch = 'c';
string str1 = "ab";
string str2 = str1 + ch;
cout << str2 << endl;

这段代码会输出:

ed before SaveGraphicsState
abc

请问有人能解释一下这行代码的处理过程吗:string str = "ab" + 'c';

8个回答

13

你对第一行的想法是正确的,这正是正在发生的事情。

"ab"这样的字面字符串没有默认的+运算符,所以编译器会将其作为C风格字符串,并使用指向该字面值的const char*指针。然后将您的字面字符'c'提升为具有某个值的int。然后将此int添加到字面值的地址并用作C字符串。由于您已超出分配给文字字符串的空间,因此结果未定义,并且它只打印了从结果地址中找到的字符,直到找到一个空字符。

如果您想一次性创建字符串,可以通过强制转换帮助编译器首先将其转换为stringstd::string str = std::string("ab") + 'c';。另外(如在单独的评论中所见),也可以使用连接来完成此操作,这可能更有效率。请使用其中哪个在您的情况下更清晰: std::string str = "ab"; str += 'c';

在第二种情况下,您已经创建了一个string,并且string有一个重载的operator+,它执行直观的连接。


2
Mark的答案是正确的。但请注意,您可以在没有任何中间+的情况下编写“ab”“c”,预处理器将为您连接它们。 - user1024732

2
string str = "ab" + 'c';

字符串字面值不能像那样进行串联。"ab"是一个字符数组,因此在此上下文中它会退化为指针,您正在向该指针添加一个整数 'c'。所以指针将按照 'c' 的 ASCII 值前进。

也就是说,上面的代码等价于:

char char * s= "ab";
string str = &s['c']; //the ascii value of 'c' acts like an index to the array. 

我确定那不是你想要的。实际上,它会调用未定义的行为,因为&s['c']引用的内存区域可能不在进程的地址空间内。


你真正想做的事情(即连接字符串),其简短形式如下:

string str = string("ab") + "c";

"string str2 = str1; str2 += ch;" 可以翻译为:将字符串str1赋值给str2,然后在str2末尾添加字符ch。 - John Dibling
-1 "ab"+'c' 不等同于 "ab"['c']。前者是一个指针,后者是一个字符。 - Robᵩ

2

您的猜测是正确的,除了字符串文字不在堆栈上,它在内存中的特定位置,通常在只读段中。


1
"ab"

是一个C字符串。

'c'

这是一个字符。

尝试:

string str = string("ab") + "c";

如果你想让它更简单,总有办法:

string str = "ab";
str += 'c';

或者,您可以使用 std::stringstream

stringstream ss;
ss << "ab" << 'c';

1

运算符重载仅在至少一个重载运算符的参数是用户定义类型(即类实例)时才起作用,因此+运算符无法被重载以添加字符字符串和字符并执行合理操作。最好的情况是进行指针算术运算-几乎肯定不是您想要的结果。通常的解决方法是进行显式转换:

string s = string( "foo" ) + "bar";    // s will contain "foobar"

0

"ab" 是一个 const char *'c' 是一个 char。 我猜测 'c' 被转换为整数,该整数加上 "ab" 的地址,然后将得到的指针传递给 std::string 的构造函数。你很幸运它没有崩溃。

请参见其他答案以了解如何正确地进行连接。


0
我认为string str = "ab" + 'c';的作用类似于:
string tmp = stirng("ab"); // implicit conversion
tmp = tmp + 'c'; // uses overloaded + operator
str = tmp;

0

这是内置于C++中的:

#include <iostream>
#include <string>

int main()
{
    std::string s("Stand back! I've got jimmies!" "DDD");
    std::cout << "Stand back! I've got jimmies!" "DDD";
}

输出:

Stand back! I've got jimmies!DDD

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接