Это (обратите внимание на оператор запятой):
#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
?
Согласно Приоритет оператора, оператор запятой имеет более низкий приоритет, чем 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
вычисляется и возвращается как результат целого выражения запятой, которое возвращается заявление о возврате потом.
Дополнительная информация о Выражения а также Заявления
Выражение — это последовательность операторов и их операндов, которая определяет вычисление.
x = 2,3;
является выражение выражения, x = 2,3
это выражение здесь.
Выражение, за которым следует точка с запятой, является утверждением.
Синтаксис:
attr(optional) expression(optional) ; (1)
return 2,3;
является заявление о прыжке (заявление о возврате), 2,3
это выражение здесь.
Синтаксис:
attr(optional) return expression(optional) ; (1)
Запятая (также известная как разделение выражений) оператор оценивается слева направо. Так return 2,3;
эквивалентно return 3;
,
Оценка x = 2,3;
является (x = 2), 3;
из-за приоритет оператора. Оценка по-прежнему слева направо, и все выражение имеет значение 3 с побочным эффектом x
предполагая значение 2.
Это утверждение:
x = 2,3;
состоит из двух выражения:
> x = 2
> 3
поскольку приоритет оператора,
=
имеет больший приоритет, чем запятая ,
, так x = 2
оценивается и после 3
, затем x
будет равен 2
,
в return
вместо:
int f(){ return 2,3; }
Синтаксис языка:
return <expression>
Заметка return
не является частью выражения.
Таким образом, в этом случае два выражения будут оцениваться:
> 2
> 3
Но только второе (3
) будет возвращен.
Попробуйте применить упрощенный подход, просто выделив приоритет в скобках:
( x = 2 ), 3;
return ( 2, 3 );
Теперь мы можем видеть, что двоичный оператор «,» работает одинаково на обоих, слева направо.