Различное поведение оператора запятой в С++ с возвратом?

Это (обратите внимание на оператор запятой):

#include <iostream>
int main() {
    int x;
    x = 2, 3;
    std::cout << x << "\n";
    return 0;
}

выводит 2.

Однако, если вы используете return с оператором запятой, это:

#include <iostream>
int f() { return 2, 3; }
int main() {
    int x;
    x = f();
    std::cout << x << "\n";
    return 0;
}

выводит 3.

Почему оператор запятой ведет себя по-другому с return?

Ответ 1

В соответствии с Приоритет оператора, оператор запятой более низкий приоритет, чем operator=, поэтому x = 2,3; эквивалентно (x = 2),3;. (Приоритет оператора определяет, как оператор будет привязан к своим аргументам, более жестким или более слабым, чем другие операторы, в соответствии с их приоритетами.)

Обратите внимание, что выражение для запятой (x = 2),3 здесь, а не 2,3. Сначала оценивается x = 2 (и его побочные эффекты завершены), тогда результат отбрасывается, затем оценивается 3 (фактически ничего не делает). Поэтому значение x равно 2. Обратите внимание, что 3 является результатом всего выражения запятой (т.е. x = 2,3), оно не будет использоваться для назначения x. (Изменить его на x = (2,3);, x будет присвоено 3.)

Для return 2,3; выражение запятой 2,3, 2 оценивается, тогда его результат отбрасывается, а затем 3 оценивается и возвращается как результат всего выражения запятой, которое возвращается return statement позже.


Дополнительная информация о Expressions и Statements

Выражение представляет собой последовательность операторов и их операндов, которая задает вычисление.

x = 2,3; выражение выражения, x = 2,3 - это выражение здесь.

Выражение, за которым следует точка с запятой, является выражением.

Синтаксис: attr(optional) expression(optional) ; (1)

return 2,3; инструкция перехода (return statement), 2,3 - это выражение здесь.

Синтаксис: attr(optional) return expression(optional) ; (1)

Ответ 2

Оператор запятой (также известный как оператор выделения) оценивается слева направо. Итак, return 2,3; эквивалентно return 3;.

Оценка x = 2,3; равна (x = 2), 3; из-за приоритета оператора. Оценка по-прежнему слева направо, и все выражение имеет значение 3 с побочным эффектом x, предполагая значение 2.

Ответ 3

Это утверждение:

  x = 2,3;

состоит из двух выражений:

> x = 2
> 3

Поскольку приоритет оператора, = имеет больше приоритета, чем запятая ,, поэтому x = 2 оценивается и после 3. Тогда x будет равно 2.


Вместо return:

int f(){ return 2,3; }

Синтаксис языка:

return <expression>

Примечание return не является частью выражения.

Итак, в этом случае будет оценено два выражения:

> 2
> 3

Но будет возвращен только второй (3).

Ответ 4

Попробуйте применить упрощенный подход, просто выделив приоритет с помощью скобок:

( x = 2 ), 3;

return ( 2, 3 );

Теперь мы можем видеть, что бинарный оператор "," работает одинаково на обоих, слева направо.