2012-03-16 8 views
5

¿Por qué compila este fragmento de código?Sucursales condicional

#include <iostream> 

int foo(int x) 
{ 
    if(x == 10) 
    return x*10; 
} 

int main() 
{ 
int a; 
std::cin>>a; 
std::cout<<foo(a)<<'\n'; 
} 

El compilador no me debe dar un error como "no todas las rutas de código devuelve un valor"? ¿Qué sucede/devuelve mi función cuando x no es igual a diez?

+0

No estrictamente relacionado, pero puede despertar su interés: http://stackoverflow.com/questions/9653722/how-does-returning-values-from-a-function-work – Corbin

+0

BTW: qué compilador es esto (de modo que Puedo evitarlo en el futuro)? –

+1

@NicolBolas: ¡No evite el compilador, evite compilar sin warn-flags! – bitmask

Respuesta

10

El resultado es indefinido, por lo que el compilador puede elegir libremente: es probable que obtenga lo que sucede al sentarse en la dirección de pila apropiada donde la persona que llama espera el resultado. Active las advertencias del compilador y su compilador le informará sobre su omisión.

+0

Llamar a una función que debería devolver algo pero no lo hace, puede causar una falla hermosa en algunos sistemas. – karlphillip

+1

@karlphillip: Sí, porque el compilador tiene permitido legalmente quemar tu casa o hacer que los dragones salgan volando por la nariz. Es por eso que agregué la palabra * probablemente * :) – bitmask

+0

Me di cuenta :) Agregué un comentario solo para señalar qué tan mala puede ser esta práctica. Buena respuesta, por cierto. – karlphillip

3

El compilador no es requiere para darle un error en esta circunstancia. Muchos lo harán, algunos solo emitirán advertencias. Algunos aparentemente no se darán cuenta.

Esto es porque es posible que su código asegura fuera de esta función que la condición siempre será cierta. Por lo tanto, no es necesariamente malo (aunque casi siempre lo es, por lo que la mayoría de los compiladores emitirán al menos una advertencia).

La especificación indicará que el resultado de salir de una función que debe devolver un valor pero no es un comportamiento indefinido. Un valor puede ser devuelto. O el programa podría bloquearse. O cualquier cosa podría pasar. No está definido