这两个C++语句连接字符串有什么区别?

What is the difference between these two C++ statements to concatenate a string?

本文关键字:字符串 连接 什么 区别 语句 C++ 两个      更新时间:2023-10-16

我是C++新手,我想知道这两行之间有什么区别:

cout << "John " << "Doe" << endl;
cout << "John " + "Doe" << endl;

第一个有效,但第二个无效。有什么想法吗?

第一行

cout << "John " << "Doe" << endl;

不连接字符串。它打印"约翰",然后打印"Doe"。但从来没有一个字符串"John Doe"。

第二行

cout << "John " + "Doe" << endl;

在语法上是错误的。字符数组没有重载operator+

连接字符串文本,您可以使用

#include <iostream>
#include <string>
using std::literals::string_literals::operator""s;
int main() {
std::cout << "John "s + "Doe"s << std::endl;
// or
auto name = "John "s + "Doe"s;
std::cout << name << std::endl;
}

自 C++14 年以来。operator""s创建一个带有operator+std::string

第二个表达式的计算结果为

cout << ("John " + "Doe") << endl;

由于语言语法(通常被认为是运算符优先级(。

"John "const char[6]类型,"Doe"const char[4]类型。由于+,两者都衰减到一个const char*指针。并且无法添加指针,因此编译器会发出诊断程序。


在第一种情况下,const char*的重载<<std::ostream使用两次,结果达到预期。

首先将"John"插入标准输出,然后插入"Doe"。最终结果是您在序列中看到两个字符串。

第二个尝试使用带有数组的加法运算符作为操作数。这是格式不正确的,因为C++中不存在这样的运算符。

对于初学者来说,没有字符串的串联。

在第一条语句中

cout << "John " << "Doe" << endl;

有顺序输出两个字符串。

在第二条声明中

cout << "John " + "Doe" << endl;

尝试使用两个类型为const char *的指针执行二进制操作+,具有数组类型的使用的字符串文本将隐式转换为这两个指针。但是,运算符+未为指针定义。

您可以使用运算符-来表示指针,例如

std::cout << "John " - "Doe" << std::endl;

此语句在语法上是正确的,但在语义上具有未定义的行为,因为指针不指向同一数组的元素。

内置数组类型没有二进制运算符 +。

对于用户定义的类模板std::basic_string,此运算符是重载的。

你可以写例如

#include <iostream>
#include <string>
int main() 
{
std::cout << std::string( "John " ) + "Doe" << std::endl;
return 0;
}

或者您可以使用用户定义的字符串文本,例如

#include <iostream>
#include <string>
int main() 
{
using namespace std::string_literals;
std::cout << "John "s + "Doe" << std::endl;
return 0;
}

或者在 C++ 17 标准中定义了新的类模板std::string_view,您也可以使用这些模板来连接字符串。

要连接两个文字字符串,只需一个接一个地编写,除了空格之外没有中间字符:

const char *lit = "John " "Doe";
std::cout << lit << 'n';

std::cout << "John "
"Doe";

等。

第二个不起作用的原因是您无法使用运算符连接两个字符串文字+。另一方面,第一种方法利用插入运算符的链接来打印多个表达式

第一种方法是在C++中连接两个字符串的正确方法。而第二种方法,默认情况下是在 Python 中连接两个字符串的方法。

您不能使用第二个,因为它不受支持,因为它表示添加两个字符串而不是串联(如 c++ 编译器所示(。

无法添加像"foo"这样的字符串文字(即operator+( 像许多其他语言一样连接在一起。这在像C++这样的低级语言中是合理的,因为(在一般情况下(这意味着必须进行分配。

但是,如果您对此感到满意,那么您可以使用std::string确实具有这些功能的对象。以下作品:

cout << string("John ") + string("Doe") << endl;