Wenn die Steuerung am Ende einer Funktion ohne Return abläuft, warum gibt es dann noch einen zurückgegebenen Wert?

#include 

int func(int &a,int &b){
    if (a>b){
        return 1;
    }
}

int main(){
    int a=4,b=12;
    std::cout<<

Ich denke, ein Laufzeitfehler sollte auftreten, da a kleiner als b ist und die return-Anweisung übersprungen wird. Es gibt jedoch tatsächlich den Wert von b aus, egal wie ich den Wert von b ändere. Könnten Sie mir bitte sagen warum?

3
Das ist vermutlich UB. Sie müssen eine Warnung erhalten "Nicht alle Codepfade geben einen Wert zurück".
hinzugefügt der Autor CinCout, Quelle

5 Antworten

Es sollte ein Laufzeitfehler erkannt werden

Das ist nicht der Fall. Das Verhalten ist undefiniert.

5
hinzugefügt

Wenn eine Funktion, die keine void -Funktion ist, zurückkehrt, ohne zurückzukehren, ist dies undefiniertes Verhalten. Es gibt nichts, was Ihr Programm oder die Laufzeitumgebung in diesem Fall "tun" soll.

5
hinzugefügt

Dies geschieht, weil ein Ergebnis von Funktionen (wenn der Rückgabetyp int ist) mithilfe des Registers rax der CPU übertragen wird. Das Schlüsselwort return platziert sein Argument in dieses Register und kehrt zur aufrufenden Funktion zurück. Es gibt jedoch auch ein implizites return -Schlüsselwort am Ende einer Funktion in C/C ++ (wenn kein expliziter return von einem Programmierer platziert wurde). Deshalb gibt diese Funktion den Steuerungsfluss an die Anruferfunktion zurück.

Der Inhalt des rax -Registers sollte jedoch in diesem Fall als zufällig behandelt werden, da der Compiler ihn für jede Variable verwenden oder sogar völlig ignorieren kann.

4
hinzugefügt
Das ist nicht erforderlich. Es ist perfekt darauf abgestimmt, einfach das auszuführen, was nach dieser Funktion im Binärbild geschieht
hinzugefügt der Autor Caleth, Quelle
Vielen Dank! Tatsächlich gibt das Programm den Wert von b aus, egal wie ich den Wert von b ändere (solange a
hinzugefügt der Autor Jerry Xu, Quelle

Sie sollten die Compiler-Warnungen nicht unterdrücken!

gcc sagt:

main.cpp: 35: 1: Warnung: Die Steuerung erreicht das Ende der nicht leeren Funktion [-Wiederholungstyp].

Wie schon erwähnt: Dein Programm hat UB! Lesen Sie also die Warnungen und korrigieren Sie Ihr Programm entsprechend!

Es sollte ein Laufzeitfehler erkannt werden

Und es ist kein Laufzeitfehler erforderlich, da der Fehler während der Kompilierzeit sichtbar ist! Die Kernsprache hat keinerlei Laufzeitfehler. Wenn während der Programmausführung Fehlermeldungen angezeigt werden, stammt dies aus dem Bibliothekscode wie ein "Beenden" von einer Ausnahme oder etwas anderem.

Es ist gut, wenn alle Warnungen aktiviert sind. Manchmal ist es auch hilfreich, verschiedene Compiler über den Code auszuführen, um möglichst viele Warnungen zu erhalten.

Für Gcc können Sie hinzufügen:

-Wall -pedantic -Wextra

That enables a lot of warnings, but not all. There are still some warnings which are not addressed like: -Wsuggest-override

3
hinzugefügt

Wenn in C ++ für eine Funktion ein Wert zurückgegeben wird, dies jedoch nicht der Fall ist, ist dies ein undefiniertes Verhalten

1
hinzugefügt