10

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

#include <string>
#include <iostream>

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

4 回答 4

21
x += '|' + b, x;

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

由于+=and的优先级+高于,操作符,所以就等价于:

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

这里:

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

试试另一个例子:

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

f(), g();

这里f()会先调用,后调用g()

希望有帮助。

于 2013-08-09T17:42:08.840 回答
3
x += '|' + b, x;

这可以编译,因为这里的逗号充当运算符(而不是分隔符),其中右侧的操作数不起作用。

来自维基百科

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

...

逗号运算符在所有 C 运算符中具有最低优先级...

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

此外,如果您在编译代码时出现警告,您可能会收到类似以下的警告:

warning: right-hand operand of comma has no effect
于 2013-08-09T18:03:21.683 回答
2
x += '|' + b, x;

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

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

以上仍然会|Bryan在您的程序中给出结果。

于 2013-08-09T17:44:04.823 回答
2
x += '|' + b, x;

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

请注意,逗号运算符的值是正确的操作数,但它通常是无用的,就像在这个例子中一样。所以它是一样的:

x += '|' + b;
x;  // no effect
于 2013-08-09T17:42:45.403 回答