连接两个字符串文字

Art*_*llé 117 c++ string syntax concatenation operators

我正在阅读Koenig的Accelerated C++.他写道:"新的想法是我们可以使用+来连接字符串和字符串文字 - 或者就此而言,使用两个字符串(但不是两个字符串文字).

很好,我认为这是有道理的.现在进行两个单独的练习,意在阐明这一点.

以下定义是否有效?

const string hello = "Hello";

const string message = hello + ",world" + "!";
Run Code Online (Sandbox Code Playgroud)

现在,我尝试执行上述操作并且有效!所以我很高兴.

然后我试着做下一个练习;

const string exclam = "!";

const string message = "Hello" + ",world" + exclam;
Run Code Online (Sandbox Code Playgroud)

这没用.现在我明白它与你无法连接两个字符串文字的事实有关,但我不理解为什么我设法让第一个例子工作之间的语义差异(不是",世界"和"! "两个字符串文字?这不应该没用吗?"但不是第二个.

Jam*_*lis 133

const string message = "Hello" + ",world" + exclam;
Run Code Online (Sandbox Code Playgroud)

+操作员已左到右结合,因此相当于括号表达式是:

const string message = (("Hello" + ",world") + exclam);
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,两个字符串文字"Hello"",world"是"补充"第一,因此错误.

连接的前两个字符串之一必须是一个std::string对象:

const string message = string("Hello") + ",world" + exclam;
Run Code Online (Sandbox Code Playgroud)

或者,您可以+通过括号表达该部分表达式来强制第二个进行求值:

const string message = "Hello" + (",world" + exclam);
Run Code Online (Sandbox Code Playgroud)

你的第一个example(hello + ",world" + "!")是有效的,因为std::string(hello)是最左边的参数之一+.即+进行评价时,其结果是std::string与串联的字符串对象,并且该所得std::string然后与级联"!".


至于为什么使用两个字符串文字不能连接+,这是因为一个字符串文字只是一个字符数组(const char [N]这里N是字符串的长度加一,对空终止).在大多数上下文中使用数组时,它将转换为指向其初始元素的指针.

所以,当你尝试做的时候"Hello" + ",world",你真正要做的就是将两个加const char*在一起,这是不可能的(将两个指针组合在一起是什么意思?)如果是这样就不会对你做什么了想要它做.


请注意,您可以通过将字符串文字放在彼此旁边来连接字符串文字; 例如,以下两个是等效的:

"Hello" ",world"
"Hello,world"
Run Code Online (Sandbox Code Playgroud)

如果您要将多个字符串文字拆分为多行,则此选项非常有用.但它们必须是字符串文字:这不适用于const char*指针或const char[N]数组.

  • 另外,`const string message ="Hello"+(",world"+ exclam);`也会起作用,因为显式括号(是一个单词?). (3认同)
  • 如果您指出第一个示例的工作原理,可能会更完整:`const string message = ((hello + ",world") + "!");` (2认同)
  • 我提到"Hello"",world"`语法不仅可用于分成多行,而且当其中一个字符串文字是宏(甚至两者)时也是如此.然后在编译时发生连接. (2认同)

Yoc*_*mer 8

你应该时刻注意类型.

虽然他们都看起来像琴弦,"Hello"",world"文字.

在你的例子中,exclam是一个std::string对象.

C++有一个运算符重载,它接受一个std::string对象并为其添加另一个字符串.当您将std::string对象与文字连接时,它将为文字进行适当的转换.

但是如果你尝试连接两个文字,编译器将无法找到一个带两个文字的运算符.


Jur*_*aho 7

你的第二个例子不起作用,因为没有operator +两个字符串文字.请注意,字符串文字不是类型string,而是类型const char *.如果您像这样修改它,您的第二个示例将起作用:

const string message = string("Hello") + ",world" + exclam;
Run Code Online (Sandbox Code Playgroud)


Tho*_*lik 6

从 C++14 开始,您可以使用两个真正的字符串文字

const string hello = "Hello"s;

const string message = hello + ",world"s + "!"s;
Run Code Online (Sandbox Code Playgroud)

或者

const string exclam = "!"s;

const string message = "Hello"s + ",world"s + exclam;
Run Code Online (Sandbox Code Playgroud)