2012-11-03 10 views
6

meine Frage ist return; das gleiche wie return NULL; in C++?In C++ ist "Rückkehr"; das gleiche wie "NULL zurückgeben"?

Ich verstehe, dass in C++, return NULL; ist das gleiche wie return 0; im Zusammenhang mit Zeigern. Offensichtlich für Ganzzahlen ist dies nicht der Fall, da NULL nicht hinzugefügt, subtrahiert usw. werden kann. Und es wird von einigen empfohlen, 0 anstelle von NULL für Zeiger zu verwenden, da dies für die Portabilität bequemer ist. Ich bin neugierig, ob dies ein weiterer Fall ist, in dem eine Gleichwertigkeit auftritt.

Ich vermute, dass sie gleichwertig sind, weil return; sagt Rückkehr 'nichts' und NULL ist 'nichts'. Kann jemand dies jedoch bestätigen oder leugnen (natürlich mit Erklärung), wäre ich sehr dankbar!

+8

Sie scheinen eine Menge Dinge zu verwirren ... –

+0

'NULL' ist nicht 'nichts', es ist ein C-Makro, das zu etwas wie '0' (aber nicht unbedingt) erweitert, das vom Zeigertyp ist und nicht ' t alias irgendwelche gültigen Zeiger. Das C++ - Äquivalent ist "nullptr". – Will

+0

Insbesondere ist der Nullzeiger ein gültiger Wert eines Zeigertyps. –

Antwort

11

is return; the same as return NULL; in C++?

Nein.

return wird verwendet, um eine Funktion zu "brechen", die keinen Rückgabewert hat, d. H. Einen Rückgabetyp von void.

return NULL gibt den Wert NULL zurück, und der Rückgabetyp der Funktion, in der er gefunden wird, muss mit NULL kompatibel sein.


I understand that in C++, return NULL; is the same as return 0; in the context of pointers.

Sort of. NULL entspricht möglicherweise nicht 0, aber es wird zumindest zu etwas konvertieren, das ist.


Obviously for integers, this is not the case as NULL cannot be added, subtracted, etc.

Sie können ganz gut Addition und Subtraktion Zeiger auszuführen. Allerdings muss NULL unbedingt einen integrierten Typ (4.10/1 und 18.1/4 in C++ 03) haben, also ist es strittig. NULL kann sehr gut ein Makro sein, das zu 0 oder 0UL erweitert.

Einige moderne Compiler werden Sie zumindest warnen, wenn es tatsächlich NULL war, die Sie geschrieben haben.


And that it is encouraged by some to use 0 instead of NULL for pointers because it is more convenient for portability. I'm curious if this is another instance where an equivalence occurs.

Nein, und ich nicht einverstanden mit diesem Rat. Obwohl ich sehen kann, woher es kommt, da NULL 's genaue Definition variiert über Implementierungen, mit NULL wird es viel einfacher mit nullptr ersetzen, wenn Sie zu C++ 11 wechseln, und wenn nichts anderes ist selbstdokumentieren.

+2

+1 Der Hinweis, '0' anstelle von' NULL' zu verwenden (kommt von Stroustroup) (http://www.stroustrup.com/bs_faq2.html#null), aber das ist nicht alles, was er über das Problem gesagt hat: er auch erwähnt mit 'nullptr' in C++ 11 :) – dasblinkenlight

+0

Vielen Dank für die umfassende Aufschlüsselung. Ich entschuldige mich, weil ich viel verwirrt habe, aber deine Antwort hat wirklich eine Menge Dinge geklärt. –

+2

@dasblinkenlight: Nicht alles, was Stroustroup sagt, muss stimmen! Vergessen Sie nicht, er ist in erster Linie für C++ verantwortlich: P –

0

Es funktioniert wie eine Void-Funktion, wobei der Return einfach die Funktion verlässt und überhaupt nichts zurückgibt. Dies wurde asked before.

6

return ohne Ausdruck funktioniert nur, wenn Ihre Funktion void, in einem Konstruktor oder in einem Destruktor deklariert ist. Wenn Sie versuchen, nichts von einer Funktion zurückzugeben, die ein int zurückgibt, ein double usw., wird Ihr Programm nicht kompilieren:

error: return-statement with no value, in function returning ‘int’

Nach §6.6.3/2 von C++ 11:

A return statement with neither an expression nor a braced-init-list can be used only in functions that do not return a value, that is, a function with the return type void, a constructor (12.1), or a destructor (12.4).

(danke sfstrabbit für den ausgezeichneten Kommentar).

+6

Siehe §6.6.3/2 von C++ 11: "Eine return-Anweisung mit weder * expression * noch einer * braced-init-list * kann nur in Funktionen verwendet werden, die keinen Wert zurückgeben, d Funktion mit dem Rückgabetyp void, einem Konstruktor (12.1) oder einem Destruktor (12.4). " –

+0

@sftrabbit Vielen Dank für Ihren ausgezeichneten Kommentar! – dasblinkenlight

+0

_Excellent_ Kommentar! –

0

return, return 0 und return NULL sind nicht das gleiche.

return nur gültig ist, mit Funktionen void Rückkehr, zB:

void func(...); 

return 0 ist für Funktionen einige int Art Rückkehr, zB:

unsigned long func(...); 

obwohl es Punkttypen mit schwimmendem wie gut funktioniert:

double func(...) { ... return 0; } 

return NULL ist für Funktionen einig pointer Art Rückkehr, z.B .:

Something *func(...); 
0

Es gibt einen Unterschied in dem resultierenden Maschinencode:

return wird nur die Befehlszeiger setzen zurück, wo der Anrufer kam.

return 0 oder return NULL wird 0 auf den Stapel gelegt, und dann legte den Befehlszeiger zurück, wo der Anrufer kam. (In C ist NULL normalerweise auf 0 abgebildet, obwohl das (kann?) In verschiedenen Implementierungen abweichen kann. In C++ sollte NULL nicht verwendet werden).