Operador de coma y expresión nula
-
28-10-2019 - |
Pregunta
Encontré este fragmento de código 1
int return_printChar1()
{
// code
// oops! no return statement
}
int return_printChar2()
{
// code
return printf("Return");
}
int main()
{
int i;
// some more code
i = return_printChar2();
if((return_printChar1(),i))
{
printf ("Gotcha");
}
}
1: Este no es un ejemplo de la vida real.
Mi pregunta es "¿El comportamiento del fragmento de código está bien definido en C y C ++?"
Mi toma:
En c el comportamiento está bien definido porque 6.5.17
dice
El operando izquierdo de un operador de coma se evalúa como un expresión vacía; Hay un punto de secuencia después de su evaluación
En c ++ 03 el comportamiento está bien definido porque 5.18
dice
Se evalúa un par de expresiones separadas por una coma de izquierda a derecha y el valor de la expresión de la izquierda es descartado.
Sin embargo, C ++ 03 (en la sección 6.6.3
) también dice que
El flujo del final de una función es equivalente a un retorno sin valor; Esto da como resultado un comportamiento indefinido en una función de retorno de valor.
Del mismo modo en C
Si el control alcanza el extremo (
}
) de la función no void (exceptomain()
) El comportamiento no está definido.
Entonces, teniendo en cuenta todos estos puntos, no puedo juzgar el comportamiento real. ¿Qué piensan ustedes?
PD: Si crees que la pregunta es inútil y tienes mejores cosas que hacer, ayúdate a ti mismo: D.
Solución
La especificación C que tengo (C99 TC3) dice
Si el} que termina una función se alcanza y el valor de la llamada de función es utilizado por la persona que llama, el comportamiento no está terminado.
El valor de una expresión que se dice que se "evalúa como una expresión vacía" se descarta. Entonces, en el caso C, no hay un comportamiento indefinido. Puede haber sido diferente en la antigua C (algunos detalles son, si no recuerdo mal).
La situación para C ++ es ligeramente diferente a la de C, porque C ++ admite objetos de clase con constructor y destructores como valores de retorno y hacer que operen con memoria no inicializada no se puede garantizar que funcione bien. Quizás esto contribuyó a las diferentes reglas para C ++.
Otros consejos
Es un comportamiento indefinido.
La evaluación de la expresión de la izquierda da como resultado fluir del final de una función de retorno de valor sin retorno. El hecho de que el valor se descarte no significa que la evaluación nunca ocurriera.
Está claramente indefinido. C99 §6.3.2.2 dice: "(Se evalúa una expresión nula para sus efectos secundarios)." Por lo tanto, la función se evalúa y fluye del final. No hay una tarjeta gratuita para salir de la cárcel.