2009-12-18 10 views
1

Possible en double:
Why is i = ++i + 1 unspecified behavior?Indéfini/non spécifié?

Considérons l'extrait suivant:.

int i=10; 
printf("%d %d %d",i,++i,i--); 

L'ordre dans lequel les arguments d'une fonction sont évalués est non spécifiée en C/C++ Il conduire à un comportement non spécifié.

Suis-je correct ou manquant quelque chose? S'il vous plaît, expliquez.

EDIT: Eh bien, certains membres estime qu'il est double et c'est un behaviour.Anyways non défini, de C99:

6.5.2.2 (10)

L'ordre d'évaluation de la fonction désignateur, les arguments réels, et sousexpressions dans les arguments réels est non spécifié, mais il y a un point de séquence avant l'appel réel.

Quelle serait donc la nomenclature exacte maintenant, ou non définieNon spécifié?

+3

Dupliquer: http://stackoverflow.com/questions/1860461/why-is-i--1-1-unspecified-behavior – GManNickG

+1

Et le terme est indéfini: il conduit à un comportement "indéfini". Tu pourrais devenir un chat. – GManNickG

+0

Duplicata: http://stackoverflow.com/questions/621542/compilers-and-argument-order-of-evaluation-in-c http://stackoverflow.com/questions/376278/parameter-evaluation-order-before- a-function-calling-in-c –

Répondre

2

Oui, true. Je suppose que c'est parce que sur différentes plates-formes différentes machines sont utilisées pour passer des arguments et donc les paramètres peuvent être évalués dans un ordre différent.

1

Ce que vous voyez est un exemple où la spécification C/C++ n'est pas définie, donc les différents compilateurs peuvent faire ce qu'ils veulent. Un compilateur peut exécuter les paramètres de gauche à droite, un autre peut le faire de droite à gauche. Il serait parfaitement correct pour un compilateur de choisir l'ordre au hasard.

Le point que votre source essaye de faire est que vous ne devriez pas compter sur aucun ordre lors du passage des paramètres. Par exemple, si vous aviez:

A(DoX(), DoY()) 

DoX et DoY ne peut pas compter sur les effets secondaires de l'autre, parce qu'ils sont exécutés dans un ordre indéfini. Pour être parfaitement explicite que vous voulez faire quelque chose comme:

int x = DoX(); 
int y = DoY(); 
A(x, y); 

Pour la majorité des codes de production dans le monde réel que vous ne courez pas dans cette situation très souvent, mais cela arrive de temps en temps.

Notez que cela est lié à, mais différent de short circuit evaluation.

Questions connexes