2016-08-29 10 views
4
#include<stdio.h> 
int sel=5,out=10; 

int findout(){ 
    if(sel==5) 
     return out*=2; 
} 

int main(){ 
    int ret1,ret2=-1; 
    ret1=findout(); 
    printf("before %d %d %d",sel,out,ret1); 
    sel=8;out=7; 
    ret2=findout(); 
    printf("\nafter %d %d %d",sel,out,ret2); 
} 

Ausgang:Was ist der Rückgabewert einer Funktion ohne Rückgabeanweisung?

vor 5 20 20

nach 8 7 8

EDIT: Mein Compiler keine warnings.Here nicht zeigen Sie es sehen können. Sein auf GNU GCC Compiler Codeblocks auf Ubuntu OS

g++ -c /home/himani/Untitled1.cpp -o /home/himani/Untitled1.o 
g++ -o /home/himani/Untitled1 /home/himani/Untitled1.o 
Process terminated with status 0 (0 minute(s), 0 second(s)) 
0 error(s), 0 warning(s) (0 minute(s), 0 second(s)) 

Hier im zweiten Fall, wenn ich keinen Wert zurückkehren (für sel=8 und out =7), wie der Wert von ret2 kommen ist 8?

+1

Achten Sie auf Ihre Compiler-Warnungen. –

+1

Was ** erwarten ** Sie den Wert von "kein Wert" zu sein? –

+1

Vermeiden Sie auch globale Variablen: * im Allgemeinen * sie mehr Schaden (Code schwer zu folgen, unerwartete Änderungen, ...) als gut. – pmg

Antwort

7

Falls eine Funktion nicht explizit einen Wert zurückgibt (main() Funktion ist eine Ausnahme), und der Rückgabewert in Anrufern verwendet wird, ruft das Programm undefined behavior.

Zitiert C11 Kapitel §6.9.1

Wenn die }, die eine Funktion beendet erreicht ist, und der Wert des Funktionsaufrufs durch den Anrufer verwendet, das Verhalten ist nicht definiert.

In Ihrem Fall, wenn die if Bedingung false, gibt es keine return Anweisung in der Regelstrecke dass kehrt ein Wert, und Sie sind mit dem „erwartet“ zurückgegebene Wert, die die Ursachen UB.

12

Wenn sel nicht 5 ist, geht Ihre Funktion findout() nicht durch eine return Anweisung.

Das ist illegal C; und dein Compiler sollte dich davor warnen.

Ignorieren Sie nicht Ihre Compiler-Warnungen.

+0

Historische Anmerkung: Bevor es ein Standard-C gab, gab es keinen "void" -Typ, also Funktionen, die nominal "int" zurückgaben, aber keinen Wert zurückgeben mussten, der "return" ohne Wert zurückgab oder vom Ende abfiel der Funktion und es gab kein Problem, solange der aufrufende Code nicht versuchte, den 'Rückgabewert' zu verwenden. Wenn C standardisiert wurde, konnte der vorhandene Code nicht ungültig gemacht werden. In allen Varianten von C war es jedoch eine sehr schlechte Idee, manchmal einen Wert zurückzugeben und manchmal keinen Wert zurückzugeben. –

+0

Ich verwende den GNU GCC Compiler unter Ubuntu OS. Es werden keine Warnungen angezeigt. Außerdem habe ich online Ide versucht es gab das gleiche Ergebnis. –

+0

@HimaniVirmani: Sie müssen Warnungen aktivieren. Versuchen Sie 'gcc -std = c99 -pedantic -Wall -Wextra source.c' für eine gute Anzahl von aktivierten Warnungen. – pmg

4

Es ist undefiniertes Verhalten. Für den Compiler ist das Ergebnis 8. Aber zum Beispiel, nachdem sie mit Clang kompilieren:

clang-3.5 main.cpp 
main.cpp:6:1: warning: control may reach end of non-void function [-Wreturn-type] 

Und beim Laufen:

./a.out 
Illegal instruction (core dumped) 
Verwandte Themen