C++ Rückgabewert ohne return-Anweisung
Wenn ich lief dieses Programm:
#include <iostream>
int sqr(int&);
int main()
{
int a=5;
std::cout<<"Square of (5) is: "<< sqr(a) <<std::endl;
std::cout<<"After pass, (a) is: "<< a <<std::endl;
return 0;
}
int sqr(int &x)
{
x= x*x;
}
Bekam ich die folgende Ausgabe:
Square of (5) is: 2280716
After pass, (a) is: 25
Was ist 2280716
? Und, wie bekomme ich einen Rückgabewert zu sqr(a)
zwar gibt es keine return
- Anweisung in der Funktion int sqr(int &x)
?
Dank.
WTF??? Warum würden Sie wollen, zu schreiben, wie code? Klar sqr ist eine mathematische Funktion, und es macht keinen Sinn, den parameter als out.
Kogan. Einfach nur testen, wie pass by reference works
Kogan. Einfach nur testen, wie pass by reference works
InformationsquelleAutor Simplicity | 2011-01-27
Du musst angemeldet sein, um einen Kommentar abzugeben.
Streng, dies führt Undefiniertes Verhalten. In der Praxis, da
sqr
hat Rückgabetypint
es wird ja immer wieder etwas, auch wenn keinereturn
- Anweisung vorhanden ist. Das kann etwas seinint
Wert.Hinzufügen
return
Anweisung und schalten Sie Warnungen in Ihrem compiler (g++ -Wall
zum Beispiel).-Wall
. (Nun, wenn Sie möchten, fügen Sie-Werror
... Nein, ich kann nicht upvote zweimal, verdammt. :-))Es ist ein wenig weniger einfach, nicht wieder alles in eine Funktion mit einem Rückgabetyp andere als
void
verursacht Undefiniertes Verhalten, nicht nur die Rückkehr von einem undefinierten Wert. Der Unterschied ist, dass besagt, dass es einen undefinierten Wert bedeutet, dass Sie einfach zu ignorieren, Wert alles in Ordnung sein wird, aber das ist nicht so. Das Programm konnte Abstürzen, korrupten stack...nur zur Klärung der undefinierten Verhalten etwas und stellen Sie sicher, verstehe ich das Problem völlig; wenn Sie beispielsweise mit der return-Wert waren ein unique_ptr<T>, ohne eine return-Anweisung, die die Funktion zurückgeben würde Müll statt eines T*, welche dann interpretiert werden, indem der Anrufer als gültig unique_ptr, und selbst wenn Sie waren, es zu ignorieren, die vorgeben, unique_ptr ' s Destruktor Abstürzen würde Ihr Programm(hoffentlich) während Sie versuchen, löschen Sie seine pointee.
InformationsquelleAutor Fred Foo
Dass etwas Müll, hängt von einer Handvoll Faktoren ab. Wahrscheinlich, dass der Wert im Speicher abgelegt, wo die Funktion würde das Ergebnis, wenn es hatte eine
return
- Anweisung. Speicher ist Links untoched und Lesen Sie dann vom Anrufer.Denke nicht das es zu viel - fügen Sie einfach eine
return
- Anweisung.InformationsquelleAutor sharptooth
Ihre Funktion
sqr()
hat keine return-Anweisung. Die Funktion ist undefiniert Verhalten bezüglich Wert zurück. Ihre erste Ausgabe zeigt den return-Wert.Sollte der compiler zeigen eine Diagnose aber.
versuchen Sie dies:
g++
zeigt keine Warnung, es sei denn-W
gegeben ist.Was ist die syntax der Verwendung
-W
?g++ .....
Dankg++ -Wall
für Standard-Warnungen. Überprüfen Sie das Handbuch für spezifische Warnhinweise.InformationsquelleAutor harper
Sind Sie versuchen, zu drucken der return-Wert von sqr(int &x), die garbage-Wert in diesem Fall. Aber nicht ordnungsgemäße Rückgabe der X*X.
versuchen Sie, die Rücksendung gilt X*X von sqe
InformationsquelleAutor aJ.
Wenn eine Funktion nicht deklariert ist
void
dann MUSS haben eine return-Anweisung zu sagen, was sollte der Wert bei der Rückgabe an den Aufrufer. Wenn Sie dies nicht tun und einfach die Funktion ohne Ende-gibt einen Wert zurück, das Ergebnis des Aufrufs dieser Funktion ist "Undefiniertes Verhalten" das bedeutet, dass Ihr Programm alles machen könnten (einschließlich, abzustürzen oder zu löschen alles, was auf Ihrer Festplatte ist).In der Regel, wenn der Wert nur eine einfache int erhalten Sie funky Nummern, aber in komplexeren Fällen kann eine Quelle der großen Probleme. Nur tun Sie das nicht.
Compiler wird normalerweise Sie darüber informieren, dass Sie vergessen haben, eine return-Anweisung, wenn Sie ordnungsgemäß angewiesen, dies zu tun (D. H., indem die maximale Warnstufe). Können Sie weglassen, um einen Wert zurückzugeben, nur für die Fälle, wo die Funktion nicht wirklich zurück (d.h. eine exception wirft oder loops für immer).
InformationsquelleAutor 6502
Müssen Sie eine Wahl treffen zwischen:
1) Übergabe by reference/value UND return einen INT.
2) die Übergabe per Referenz void zurück.
Diese Wahl hängt von dem Zweck Ihrer Funktion.
Wenn Sie möchten, eine Funktion, die Ihnen das Quadrat einer Zahl verwenden die erste. Wenn Sie möchten, eine Funktion, eine variable und ersetzt es durch das Quadrat, verwenden Sie die zweite.
Also entweder:
ODER
InformationsquelleAutor Jack