Zitat Zitat von MagicMagor Beitrag anzeigen
Meine Frage ist jetzt, gibt es eine Konvention oder eine sonstige Regel im C-Standard die besagt, was i hier im Beispiel nach dem Funktionsaufruf für einen Wert haben soll, oder ist das unbestimmt und letztlich dem Zufall überlassen?
Und falls es dafür keinen vorgeschriebenen Weg gibt, wieso moniert der Compiler diesen Umstand nicht und gibt zumindest eine Warnung aus?
Weiß da jemand genaueres?
Gleich zu Beginn: Ich bin weder der größte Experte bei noch Fan von C, daher ist meine Antwort mit Vorsicht zu genießen und besser erst aufzunehmen, wenn jemand "Stimmt so" drunter schreibt.

Aber ich denke, das kommt einfach drauf an, welche Compilerflags du verwendest. Mit -ansi -pedantic -Wall sollte er eigentlich schon meckern, bzw. es gar nicht erst kompilieren, wenn eine Funktion entgegen des Headers nichts zurückgibt, daher kann das drüberliegende Problem gar nicht auftreten.

Ohne die Flags ist GCC aber gerade mal ein etwas höherer Assembler, sprich: er setzt die Statements in Maschinencode um, ohne groß was zu prüfen. Daher wird er bei der Funktion, wenn sie nicht mit 1 aufgerufen wird, einfach zurückspringen, ohne was ins Return-Register zu schreiben. Das aufrufende Statement kann das aber natürlich nicht ahnen und weist i daher den Wert des Return-Registers zu, was auch immer der sein mag. Resultat: Chaos. *shrug*

Also, was ich denke: Falls es erfolgreich kompiliert ist das Ergebnis undefiniert, aber mit den richtigen Flags sollte sowas gar nicht erst kompilieren. Und wenn man schon in C programmiert, sollte man die Flags auch tunlichst verwenden, um zumindest einen Teil der Riesenmenge an üblichen Bugs zu vermeiden.

Edit: OK, dann höre einfach auf den, der sich auskennt. XD