Возвращает ли оператор или функцию? - PullRequest
22 голосов
/ 06 мая 2010

Я думаю, что это слишком просто, но как работают оба из них?

return true;   // 1

и

return (true); // 2

Похоже: sizeof, exit

Мое предположение:

Если бы return был функцией, 1 был бы ошибочным.

Итак, return должен быть unary operator, который можеттакже взять в скобках ... очень похоже на unary minus: -5 и -(5), оба в порядке.

Это то, что это - унарный оператор?

Ответы [ 7 ]

29 голосов
/ 06 мая 2010

return - это ключевое слово , которое управляет потоком управления . В этом он похож на if, for и т. Д. Его можно использовать с выражением или без него (return; возвращает функцию void). Конечно, как и во всех выражениях, допускаются дополнительные скобки. (Таким образом, return (42); аналогичен int i = (4*10+2);, в обоих случаях скобки являются избыточными, но допускаются.)

sizeof - это ключевое слово , которое оператор , аналогично new, delete, +, -> :: и т. Д.

std::exit() - это идентификатор , который обозначает функцию стандартной библиотеки C (которая никогда не возвращается вызывающей стороне).

27 голосов
/ 06 мая 2010

return - это просто конструкция потока языка / управления. Это, конечно, не функция, поскольку она синтаксически неприводима, и на самом деле это не оператор, поскольку она не имеет возвращаемого значения.

17 голосов
/ 06 мая 2010

return не является оператором и не является функцией.return - это ключевое слово, которое формирует оператор возврата , который относится к категории операторов перехода .В этом отношении он не имеет абсолютно никакого сходства с sizeof или exit.

Требование поставить () вокруг аргумента return существовало в древних предстандартных версиях C (CRM C, например), но был быстро устранен, хотя причудливую привычку заключать аргумент return в лишнее () время от времени можно наблюдать даже сегодня.

7 голосов
/ 06 мая 2010

return - это ключевое слово потока управления, такое же как goto, break, continue, if, else ... Не думайте об этом как о операторе, потому что оно не изменяет значение за этим. () предназначены только для оценки выражений, и результат вычисленного выражения будет передан вызывающей функции (как это зависит от реализации компилятора).

Это тоже определенно не функция, просто подумайте: как бы вы вернулись из возврата?

4 голосов
/ 06 мая 2010

«возврат» не является ни подпрограммой, ни оператором.

Это переводит к известной инструкции ассемблера. Например, в архитектуре x86 он переводится как «ret», а в архитектуре PowerPC - как «blr».

Для возвращаемого значения компилятор перемещает это значение в соответствующий регистр (ы) перед выдачей инструкции возврата. В архитектуре x86 это обычно EAX и EDX, если необходимо - регистры немного изменятся для x86-64. На КПП, если память не изменяет, это r1 - другие могут поправить меня, если я ошибаюсь в этой детали.

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

2 голосов
/ 06 мая 2010
'true' is an Expression, 
'(true)' is an Expression. 

За возвращением всегда может следовать выражение, но для возврата к проверке типа выражение должно иметь тот же тип, что и тип возврата функции.

тогда вы можете обобщить это, сказав

return Expression. 

(В функции с типом возврата void за return не может следовать выражение; пустой return просто выходит из функции.)

0 голосов
/ 07 мая 2010

"Требование поставить () вокруг аргумента возврата существовало в древних предстандартных версиях C (CRM C, например), но было быстро устранено, даже несмотря на причудливую привычку заключать аргумент возврата в избыточное () время от времени можно увидеть и сегодня. "

Да, вы знаете, что смотрите на какой-то старый код, или кто-то думает, что return - это функция, когда вы видите, что они постоянно используют паренсы. Мой преподаватель колледжа делал это, и это раздражало меня все время. Ну, по крайней мере, он был последовательным.

...