字符串连接,为什么编译?

时间:2013-08-09 17:39:55

标签: c++

我在我的代码中发现了这个,这是我的错字,但它仍然编译。谁知道为什么? 我不知道。

#include <string>
#include <iostream>

int main()
{
  std::string x;
  std::string b = "Bryan";
  x += '|' + b, x;
  std::cout << x << std::endl;
}

4 个答案:

答案 0 :(得分:21)

x += '|' + b, x;

这里,基本上是一个运算符,其左操作数首先被计算,然后是右操作数。就这么简单。

由于+=+的优先级高于,运算符,因此它等同于:

(x += '|' + b) ,  x;

下面:

left  operand => (x += '|' + b)
right operand =>  x

尝试另一个例子:

int f() { ... }
int g() { ... }

f(), g();

首先调用f(),然后调用g()

希望有所帮助。

答案 1 :(得分:3)

x += '|' + b, x;

这个编译是因为这里的逗号充当了右边操作数无效的操作符(而不是分隔符)。

来自Wikipedia

  

在C和C ++编程语言中,逗号运算符(由标记表示)是一个二元运算符,它计算第一个操作数并丢弃结果,然后计算第二个操作数并返回该值(和类型)。

     

...

     

逗号运算符具有任何C运算符的最低优先级......

x += '|' + b, x;中,运算符+=的优先级高于,,运算符+的优先级高于+=,这意味着它等同于(x += ('|' + b)), x {1}};

此外,如果您编写带有警告的代码,您可能会收到类似这样的警告:

warning: right-hand operand of comma has no effect

答案 2 :(得分:2)

x += '|' + b, x;

这是一个逗号运算符,其优先级最低。它需要两个操作数,从左到右评估它们。在这个例子中,它的两个操作数都是完全合法的:

请注意,逗号运算符具有右操作数的值,但它通常没用,就像在此示例中一样。所以它与:

相同
x += '|' + b;
x;  // no effect

答案 3 :(得分:2)

x += '|' + b, x;

这是因为,运算符之前的表达式生效了。例如 -

std::string y("Hello");
x += '|' + b, y;

上述内容仍会在您的计划中提供结果|Bryan