这两个C++语句连接字符串有什么区别?
What is the difference between these two C++ statements to concatenate a string?
我是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;
- 使用短运算符的字符串连接有区别吗?
- 字符串连接时间复杂度 c++
- 如何将两个 jlong 数据类型转换为 jstring,然后将两个字符串连接在一起以便从 JNI 将字符串返回给 jav
- 如何在 C 宏中将变量字符串与文字字符串连接起来?
- C++中干净高效的字符串连接
- 如何将 Unicode 字符串连接成字符串以传递到 mysql 调用中
- 如何与字符串连接thar数组
- 如何将平台^字符串转换为wstring,然后与L字符串连接
- 如何在c++中进行快速字符串连接
- 在C++中,相当于CPython字符串连接
- 如何在 c++ 中使用 STL 将带有空格的字符串连接成一个字符串
- C++将三个char*字符串连接在一起
- 尝试通过二叉树中的递归返回字符串(连接)
- 使用流的字符串连接返回垃圾
- 将字符串变量与整数和文本字符串连接起来的 C++ 字符串流
- 将 int 变量与字符串连接会导致奇怪的输出
- C++ 将常量字符 * 与字符串连接起来,仅打印常量字符 *
- 通过将模板参数与字符串连接起来生成C++类型名
- 将我的对象与字符串连接
- 没有得到预期的结果字符串连接