2010-05-06 2 views
22

Это слишком основа, я думаю, но как они работают?Возвращает оператор или функцию?

return true; // 1 

и

return (true); // 2 

Похожие: sizeof, exit

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

Если возвращение была функция, 1 бы ошибочный.

Таким образом, возвращение должно быть unary operator, которые также могут взять в скобки ... довольно много, как unary minus: -5 и -(5), оба хорошо.

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

+25

Если 'return' была функцией, как бы она вернулась от себя? – Nefrubyr

+4

@Nefrubyr: функции void не нуждаются в явных операторах return. – Lazer

+1

sizeof - это команда времени компиляции. В качестве следствия Довольно знаменитый gotchas - это то, что sizeof (f()) фактически не вызывает f. – fulmicoton

ответ

29

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

sizeof является ключевое слово, что является оператор, похожий на new, delete, +, ->, :: и т.д.

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

+0

Я думал, что 'sizeof()' был макросом? Или, по крайней мере, только рассчитывается во время компиляции? – dlamotte

+0

nevermind, 'sizeof()' было ключевым словом для компиляции в C89, но теперь это время выполнения (из-за VLA, yuck!) – dlamotte

+0

@xyld: Это все еще __keyword__, и это все еще __оператор__. ':)' – sbi

27

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

+0

@Will Vousden: что такое «конструкция контрольного потока», кроме того, что мне говорит? – Lazer

+2

Хорошая точка. Если 'return' имел значение' return', это было бы слишком рекурсивно;) – ereOn

+3

@eSKay: Конструкция потока управления - это то, что изменяет поток управления программой. См. Здесь: http://en.wikipedia.org/wiki/Control_flow 'return' также можно рассматривать как конструкцию языка, поскольку она фактически является частью синтаксиса языка. См. Здесь: http: //en.wikipedia.org/wiki/Language_construct –

17

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

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

+0

@AndreyT: операторы 'sizeof' и' exit'? – Lazer

+2

@eSKay: 'sizeof' является оператором. 'exit' является библиотечной функцией stanadard. – AnT

+0

okay ... так что в случае ошибки в моей программе, где мне нужно прервать, следует ли использовать 'exit (0)' или 'return'? Есть ли какая-то ситуация, когда 'exit (0)' должно быть предпочтительным? – Lazer

7

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

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

4

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

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

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

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

+0

Как я помню, r1 - указатель стека, а r3 - возвращаемое значение. См. Рисунок A-1 здесь: http://wall.riscom.net/books/proc/ppc/cwg/a_abi.html – Nefrubyr

2
'true' is an Expression, 
'(true)' is an Expression. 

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

Hense вы можете обобщить его, говоря

return Expression. 

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

0

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

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

Смежные вопросы