Die Funktion liefert den Wert ohne return-Anweisung
Warum funktioniert folgende code ist eine korrekte Ausgabe? int GGT hat keine return-Anweisung, aber der code funktioniert trotzdem? Es gibt keine globalen Variablen gesetzt.
#include <stdio.h>
#include <stdlib.h>
int GGT(int, int);
void main() {
int x1, x2;
printf("Bitte geben Sie zwei Zahlen ein: \n");
scanf("%d", &x1);
scanf("%d", &x2);
printf("GGT ist: %d\n", GGT(x1, x2));
system("Pause");
}
int GGT(int x1, int x2) {
while(x1 != x2) {
if(x1 > x2) {
/*return*/ x1 = x1 - x2;
}
else {
/*return*/ x2 = x2 - x1;
}
}
}
Schalten Sie die Warnung Ebene, bis auf den compiler, und Sie sollten eine Meldung erhalten...
Ich erhalte eine Warnmeldung, aber ich bin interessted, warum es funktioniert, weiß der compiler setzt einen return-Wert, wenn niemand da ist?
möglich, Duplikat der C-Funktion definiert als int aber ohne return-Anweisung im Körper noch kompiliert
Ich erhalte eine Warnmeldung, aber ich bin interessted, warum es funktioniert, weiß der compiler setzt einen return-Wert, wenn niemand da ist?
möglich, Duplikat der C-Funktion definiert als int aber ohne return-Anweisung im Körper noch kompiliert
InformationsquelleAutor Pascal Bayer | 2011-01-10
Du musst angemeldet sein, um einen Kommentar abzugeben.
Für x86-zumindest der Rückgabewert dieser Funktion sollte in
eax
registrieren. Alles, was dort war, als der Rückgabewert vom Aufrufer.Weil
eax
wird als Rückkehr registrieren, ist es oft als "scratch" - register vom aufgerufenen, weil Sie nicht brauchen, zu erhalten. Dies bedeutet, dass es sehr gut möglich, dass es verwendet wird, als jede der lokalen Variablen. Weil beide von Ihnen sind gleich am Ende, es ist wahrscheinlicher, dass der richtige Wert wird Links ineax
.InformationsquelleAutor ruslik
Sollte es nicht funktionieren, und sicherlich nicht auf allen Compilern und Ziel-OS, auch wenn es funktioniert bei dir möglich ist.
Die wahrscheinlichste Erklärung ist, dass eine function returning int " immer wieder etwas, und es ist in der Regel der Inhalt eines register. Es geschieht wahrscheinlich, dass das register verwendet für die Rückkehr Wert ist in Ihrem Fall die gleichen verwendet zum berechnen der Letzte Ausdruck vor der Rückgabe aus der Funktion (auf x86-Ziele, sicherlich eax).
Diesem wird gesagt, einen optimierten compiler, die erkennen lassen, dass es keine Rückkehr erlaubt, um vollständig zu entfernen den code dieser Funktion. Fortan wird der Effekt, den Sie sehen (können) verschwinden beim aktivieren höher Optimierungen Ebenen.
Getestet habe ich es mit gcc:
gcc ohne Optimierung:
Eingänge, 10, 20 -> das Ergebnis ist 10
gcc -O1
Eingänge, 10, 20 -> Ergebnis ist 1
gcc -O2
Eingänge, 10, 20 -> das Ergebnis ist 0
InformationsquelleAutor kriss
Auf x86 ist der Rückgabewert gespeichert in EAX-register, die "zufällig" auch von diesem compiler zum speichern des Ergebnisses der arithmetischen Operationen (oder zumindest Subtraktion). Sie können dies überprüfen, durch suchen auf der assembly generiert, die von Ihrem compiler. Ich Stimme mit kriss - Sie können nicht annehmen, dass dies immer der Fall sein wird, so ist es besser, explizit den Rückgabewert.
InformationsquelleAutor Robert Kolner
GCC-Pasten "ret" - Anweisung in einem solchen Fall, während das Geräusch Pasten "ud2" und stürzt die app zur Laufzeit.
InformationsquelleAutor ARA1307
Benötigen Sie nicht die return-Anweisung, wenn Sie mit Zeigern. In der Regel können Sie nur Rückgabe eines Wertes durch Return-Anweisung, aber wenn Sie den Zeiger verwenden Sie zurückkehren konnten, wie viele Sie wollen.
scanf("%d", &x1); Sie geben der Funktion eine Adresse der X1 nicht X1-Wert. Zeiger arbeitet, Breite Adressen. man kann Bücher Lesen, um zu erfahren, wie funktioniert Zeiger.
Aber dies hat nichts mit der Frage zu tun.
OH, sorry, tut mir Leid. Ich dachte, es war schrieben. GGT(&x1, &x2)) und int GGT(int *x1, int *x2). Ich dont read Code detally, ich bin noch Recht, sorry. 🙂
InformationsquelleAutor VakhoQ