Почему это компилируется?
Я нашел это в своем коде, был опечаткой с моей стороны, но он все еще скомпилирован. Кто-нибудь знает, почему?
Я понятия не имею.
#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
в вашей программе.