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

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

#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?

76

Решение

Согласно Приоритет оператора, оператор запятой имеет более низкий приоритет, чем 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)

131

Другие решения

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

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

31

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

  x = 2,3;

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

> x = 2
> 3

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


в return вместо:

int f(){ return 2,3; }

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

return <expression>

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

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

> 2
> 3

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

19

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

( x = 2 ), 3;

return ( 2, 3 );

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

2
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector