Question

Je suis tombé sur cet extrait de code 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: Ce n'est pas un exemple réel.

Ma question est "Le comportement de l'extrait de code est-il bien défini en C et C ++?"

Ma prise:

En C, le comportement est bien défini parce que 6.5.17 dit

L'opérande gauche d'un opérateur de virgule est évalué comme un Expression vide; Il y a un point de séquence après son évaluation

Dans C ++ 03, le comportement est bien défini car 5.18 dit

Une paire d'expressions séparées par une virgule est évaluée de gauche à droite et la valeur de l'expression gauche est mis au rebut.

Cependant C ++ 03 (en section 6.6.3) dit également que

Écouler la fin d'une fonction équivaut à un retour avec aucune valeur; Il en résulte un comportement non défini dans une fonction de retour de valeur.

De même en c

Si le contrôle atteint la fin (}) de la fonction non vide (sauf main()) Le comportement n'est pas défini.

Donc, en tenant compte de tous ces points, je ne peux pas juger le comportement réel. Qu'est-ce que vous en pensez?

PS: Si vous pensez que la question est inutile et que vous avez de meilleures choses à faire, aidez-vous: D.

Était-ce utile?

La solution

La spécification C que j'ai (C99 TC3)

Si le} qui termine une fonction est atteint et que la valeur de l'appel de fonction est utilisée par l'appelant, le comportement n'est pas fini.

La valeur d'une expression qui serait "évaluée comme une expression vide" est rejetée. Ainsi, dans le cas C, il n'y a pas de comportement non défini. Cela a peut-être été différent dans Old C (certains détails le sont, si je me souviens bien).

La situation pour C ++ est légèrement différente de celle de C, car C ++ prend en charge les objets de classe avec le constructeur et les destructeurs en tant que valeurs de retour et les faire fonctionner sur une mémoire non initialisée ne peut pas être bien garanti. Cela a peut-être contribué aux différentes règles pour C ++.

Autres conseils

C'est un comportement indéfini.

L'évaluation de l'expression gauche entraîne l'écoulement de la fin d'une fonction de retour de valeur sans rendement. Ce n'est pas parce que la valeur est rejetée que l'évaluation n'a jamais eu lieu.

C'est clairement indéfini. C99 §6.3.2.2 dit: "(Une expression vide est évaluée pour ses effets secondaires.)" La fonction est donc évaluée et s'écoule de l'extrémité. Il n'y a pas de carte gratuite de sortir de prison.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top