Почему это компилируется?

Я нашел это в своем коде, был опечаткой с моей стороны, но он все еще скомпилирован. Кто-нибудь знает, почему? Я понятия не имею.

#include <string>
#include <iostream>

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

Ответ 1

x += '|' + b, x;

Здесь , - это в основном оператор, левый операнд которого оценивается первым, а затем правый операнд. Это просто.

Поскольку приоритет += и + выше, чем оператор ,, он становится эквивалентным этому:

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

Здесь:

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

Попробуйте другой пример:

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

f(), g();

Здесь f() будет вызываться сначала, а затем g().

Надеюсь, что это поможет.

Ответ 2

x += '|' + b, x;

Это компилируется, потому что здесь запятая действует как оператор (вместо разделителя), где правый операнд не действует.

Из Wikipedia:

В языках программирования C и С++ оператор запятой (представленный токеном) является двоичным оператором, который оценивает свой первый операнд и отбрасывает результат, а затем вычисляет второй операнд и возвращает это значение (и тип).

...

Оператор запятой имеет самый низкий приоритет любого оператора C...

В x += '|' + b, x; оператор += имеет более высокий приоритет, чем ,, а оператор + имеет более высокий приоритет, чем +=, что означает, что он эквивалентен (x += ('|' + b)), x;

Кроме того, если вы скомпилируете свой код с предупреждениями, вы, скорее всего, получите предупреждение, подобное этому:

warning: right-hand operand of comma has no effect

Ответ 3

x += '|' + b, x;

Это оператор запятой, который имеет самый низкий приоритет. Он принимает два операнда, оценивает их слева направо. В этом примере оба его операнда совершенно законны:

Обратите внимание, что оператор запятой имеет значение правого операнда, но он обычно бесполезен, как в этом примере. То же самое:

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

Ответ 4

x += '|' + b, x;

Это потому, что выражение перед оператором , берет на себя. Например -

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

Вышеуказанный результат все равно даст результат |Bryan в вашей программе.