2010-05-06 16 views
22

Das ist zu einfach, denke ich, aber wie funktionieren beide?Gibt es einen Operator oder eine Funktion?

return true; // 1 

und

return (true); // 2 

Ähnliche: sizeof, exit

Meine Vermutung:

Wenn Rückkehr eine Funktion war, 1 fehlerhafte wäre.

So soll Rückkehr ein unary operator sein, dass auch in Klammern nehmen ... so ziemlich wie unary minus: -5 und -(5), beide sind in Ordnung.

Ist es das - ein unärer Operator?

+25

Wenn 'return' eine Funktion wäre, wie würde es von selbst zurückkehren? – Nefrubyr

+4

@Nefrubyr: Void-Funktionen benötigen keine expliziten Rückgabeanweisungen. – Lazer

+1

sizeof ist ein Kompilierzeitbefehl. Als logische Folge Ein ziemlich berühmter Fall ist, dass sizeof (f()) f nicht wirklich aufruft. – fulmicoton

Antwort

29

return ist ein Schlüsselwort dass Steuerfluß manipuliert. Es ist ähnlich wie if, for etc. Es kann mit oder ohne Ausdruck verwendet werden (return; kehrt von einer void Funktion zurück). Wie bei allen Ausdrücken sind natürlich zusätzliche Klammern erlaubt. (So ​​return (42); ist ähnlich int i = (4*10+2);, in beiden Fällen sind die Klammern sind redundant, aber erlaubt.)

sizeof ist ein Stichwort, die ein Operator, ähnlich wie new, delete, +, ->, :: usw.

std::exit() ist ein Identifikator die einen functio bezeichnet n der C-Standardbibliothek (die niemals zum Aufrufer zurückkehrt).

+0

Ich dachte 'sizeof()' war ein Makro? Oder zumindest nur zur Kompilierzeit berechnet? – dlamotte

+0

nevermind, 'sizeof()' war ein Kompilierungsschlüsselwort in C89, aber jetzt ist eine Laufzeit Sache (wegen VLAs, yuck!) – dlamotte

+0

@ xyld: Es ist immer noch ein __keyword__ und es ist immer noch ein __operator__. ':)' – sbi

27

return ist nur ein Sprach-/Kontrollflusskonstrukt. Es ist sicherlich keine Funktion, da es syntaktisch irreduzibel ist, und es ist auch nicht wirklich ein Operator, da es keinen Rückgabewert hat.

+0

@Will Vousden: Was ist ein "Kontrollflusskonstrukt", abgesehen von dem, was der Name mir sagt? – Lazer

+2

Schöner Punkt. Wenn "return" einen "return" -Wert hat, wäre es etwas zu rekursiv;) – ereOn

+3

@eSKay: Ein Kontrollflusskonstrukt verändert den Fluss der Programmsteuerung. Siehe hier: http://en.wikipedia.org/wiki/Control_flow 'return' könnte auch als Sprachkonstrukt betrachtet werden, da es tatsächlich Teil der Syntax der Sprache ist. Siehe hier: http://en.wikipedia.org/wiki/Language_construct –

17

return ist kein Operator und ist keine Funktion. return ist ein Schlüsselwort, das eine Return-Anweisung bildet, die zu der Kategorie Sprunganweisungen gehört. In dieser Hinsicht hat es absolut keine Ähnlichkeiten mit entweder sizeof oder.

Die Forderung () um das Argument von return in alten Vornorm Versionen von C (CRM C, zum Beispiel) bestand zu setzen, wurde aber obwohl schnell beseitigt, auch die schrullige Gewohnheit das Argument von return in überflüssig () einzuzuwickeln kann von Zeit zu Zeit sogar heute noch gesehen werden.

+0

@AndreyT: Sind 'sizeof' und' exit' Operatoren? – Lazer

+2

@eSKay: 'sizeof' ist ein Operator. 'exit' ist eine Stanadard-Bibliotheksfunktion. – AnT

+0

okay ... also sollte ich im Falle einer Fehlerbedingung in meinem Programm, wo ich abbrechen muss, 'exit (0)' oder eine 'return' verwenden? Gibt es eine Situation, in der "exit (0)" bevorzugt werden sollte? – Lazer

7

Rückkehr ist ein Steuerfluss Schlüsselwort, wie goto, break, continue, if, else ... Sie denken es nicht als Operator, weil es nicht den Wert dahinter nicht verändert. Die () dienen nur zum Auswerten von Ausdrücken und das Ergebnis des ausgewerteten Ausdrucks wird an die aufrufende Funktion übergeben (wie hängt es von der Compilerimplementierung ab).

Es ist auch sicherlich keine Funktion, nur darüber nachdenken: Wie würden Sie von der Rückkehr zurückkehren?

4

"Rückkehr" ist weder eine Routine noch ein Operator.

Es übersetzt zu wohlbekannter Assembleranweisung. Auf der x86-Architektur wird es beispielsweise in "ret" übersetzt, und auf der PowerPC-Architektur wird es in "blr" übersetzt.

Für den Wert, den es zurückgibt, verschiebt der Compiler diesen Wert in die entsprechenden Register, bevor die Rückgabeanweisung ausgegeben wird. Bei der x86-Architektur sind dies normalerweise EAX und EDX, falls erforderlich - die Register ändern sich geringfügig für x86-64. Auf PPC, wenn Speicher dient, ist es r1 - andere können mich korrigieren, wenn ich falsch in diesem Detail bin.

Hoffe, das hilft.

+0

Wie ich mich erinnere, ist r1 der Stapelzeiger und r3 der Rückgabewert. Siehe Abbildung A-1 hier: http://wall.riscom.net/books/proc/ppc/cwg/a_abi.html – Nefrubyr

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

Rückkehr immer gefolgt von einem Ausdruck, aber für die Rückkehr überprüfen zu geben, der Ausdruck muss den gleichen Typ des Rückgabetyp der Funktion haben.

hense Sie es mit den Worten

verallgemeinern kann
return Expression. 

(In einer Funktion mit einem void Rückgabetyp, return kann nicht durch einen Ausdruck gefolgt werden, eine nackte return einfach die Funktion beendet.)

0

"Die Anforderung, das Argument der Rückkehr zu setzen() existierte in alten vor-Standard-Versionen von C (CRM C, zum Beispiel), wurde aber schnell beseitigt, obwohl die eigenartige Gewohnheit, das Argument der Rückkehr in überflüssige() zu wickeln von heute bis heute gesehen werden. "

Ja, Sie wissen, dass Sie einige alte Code betrachten oder jemand denkt, dass Rückkehr eine Funktion ist, wenn Sie sehen, dass sie Parens damit die ganze Zeit verwenden. Mein College-Lehrer hat das gemacht und es hat mich die ganze Zeit geärgert. Oh, zumindest war er konsequent.

Verwandte Themen