significa - porque sale 0 en buscarv
¿Puede una función de retorno de vacío g devolver f(); cuando f vuelve vacío? (3)
Cualquier cosa después del return
es una expresión.
6.8.6: 1 declaraciones de saltos
Syntax ... return expressionopt;
Y la norma dice que:
Una declaración de retorno con una expresión no aparecerá en una función cuyo tipo de retorno sea nulo. ....
f()
es también una expresión aquí. El compilador debería avisar.
[Warning] ISO C forbids ''return'' with expression, in function returning void [-pedantic]
Considere el siguiente fragmento de código:
void f(void);
void g(…)
{
…
return f();
…
}
Es este return f();
válido de acuerdo con C11?
No estoy abogando por usar este patrón: si funciona, obviamente es equivalente a f(); return;
f(); return;
(donde el return;
sí mismo sería redundante si esto se encuentra al final de la función g()
). Estoy haciendo esta pregunta en el contexto del análisis estático de los programas de C, donde el código C ya ha sido escrito por otra persona y la pregunta es si es válido o no de acuerdo con la norma.
Interpretaría C11 6.8.6.4:1 en el sentido de que no es estándar y debería rechazarse estáticamente. ¿Es posible interpretarlo de manera diferente (he encontrado este patrón en un código fuente real y de alta calidad)?
Restricciones
Una declaración de retorno con una expresión no aparecerá en una función cuyo tipo de retorno sea nulo. Una declaración de retorno sin una expresión solo aparecerá en una función cuyo tipo de retorno sea nulo.
Esto claramente es una violación de restricción, en particular en vista de
6.3.2.2 void: el valor (inexistente) de una expresión void (una expresión que tiene el tipo void) no se utilizará de ninguna manera,
Eso significa que el void
tipo incompleto es un callejón sin salida que no se puede reutilizar para ningún propósito.
Indica claramente que A return statement without an expression shall only appear in a function whose return type is void
, intente y ejecute esto:
void g()
{
return; // does not return any expression at all
}
void f()
{
return g();
}
int main(void) {
f();
return 0;
}