连接两个字符串文字

时间:2011-05-19 16:15:13

标签: c++ string syntax operators concatenation

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

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

以下定义是否有效?

const string hello = "Hello";

const string message = hello + ",world" + "!";

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

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

const string exclam = "!";

const string message = "Hello" + ",world" + exclam;

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

5 个答案:

答案 0 :(得分:131)

const string message = "Hello" + ",world" + exclam;

+运算符具有从左到右的关联性,因此等效的括号表达式为:

const string message = (("Hello" + ",world") + exclam);

如您所见,首先“添加”两个字符串文字"Hello"",world",因此出错。

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

const string message = string("Hello") + ",world" + exclam;

或者,您可以通过括号表达该部分表达式来强制首先评估第二个+

const string message = "Hello" + (",world" + exclam);

有意义的是,您的第一个示例(hello + ",world" + "!")有效,因为std::stringhello)是最左侧+的参数之一。评估+,结果是带有连接字符串的std::string对象,然后生成的std::string"!"连接。


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

所以,当你尝试N时,你真正要做的就是将两个"Hello" + ",world"加在一起,这是不可能的(将两个指针加在一起意味着什么? ?)如果它不会做你想做的事。


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

const char*

如果您要将多个字符串文字拆分为多行,这将非常有用。但它们必须是字符串文字:这不适用于"Hello" ",world" "Hello,world" 指针或const char*数组。

答案 1 :(得分:8)

您应始终注意类型

虽然它们看起来像字符串,但"Hello"",world"文字

在您的示例中,exclamstd::string对象。

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

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

答案 2 :(得分:6)

您的第二个示例不起作用,因为两个字符串文字没有operator +。请注意,字符串文字不是string类型,而是类型const char *。如果您按照以下方式修改它,您的第二个示例将起作用:

const string message = string("Hello") + ",world" + exclam;

答案 3 :(得分:2)

在案例1中,由于您的操作顺序:

(你好+“,世界”)+“!”哪个解析为你好+“!”最后打招呼

在案例2中,正如詹姆斯所说,你得到:

(“Hello”+“,world”)+ exclam是2个字符串文字的连续。

希望很清楚:)

答案 4 :(得分:1)

字符串(或准确地说,std::string)与字符文字之间的区别在于后者没有定义+运算符。这就是第二个例子失败的原因。

在第一种情况下,编译器可以找到合适的operator+,其中第一个参数为string,第二个参数为字符文字(const char*),因此它使用了它。该操作的结果再次为string,因此在向其添加"!"时会重复相同的操作。