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 (excepto main()) 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.

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top