2010-09-06 19 views
3

Possible en double:
C programming: is this undefined behavior?Pourquoi ce programme C donne-t-il une sortie inattendue?

#include<stdio.h> 
main() 
{ 
int i=5; 
printf("%d%d%d",i,i++,++i); 
} 

mon résultat attendu est 556. Mais quand j'exécutaient le résultat est 767. comment?

+0

Dupliquer de [programmation C: est-ce un comportement non défini?] (Http://stackoverflow.com/questions/3450582/c-programming-is-this-undefined-behavior) (le code dans cette question est seulement légèrement différent et la réponse de Jerry Coffin est assez claire et concise) –

+0

Quel compilateur utilisez-vous? – bmargulies

+0

@James Cette question était en fait assez différente: si l'argument supplémentaire de 'printf()' a abouti à un "comportement indéfini". Ce n'est * pas * un doublon par tous les moyens. Je voterai pour rouvrir si cela se ferme. – NullUserException

Répondre

-1
$ gcc -Wall arst.c 
arst.c:2:1: warning: return type defaults to ‘int’ 

arst.c: In function ‘main’: 

arst.c:5:27: warning: operation on ‘i’ may be undefined 

arst.c:5:27: warning: operation on ‘i’ may be undefined 

arst.c:6:1: warning: control reaches end of non-void function 

Voilà comment.

+2

Sans expliquer ** pourquoi ** l'opération "sur" peut être indéfinie, "cette réponse est tout à fait inutile. –

1

Vous ne pouvez pas être sûr que les incréments sont exécutés dans l'ordre attendu, car les instructions à l'intérieur des arguments sont exécutées dans l'ordre choisi par votre compilateur.

0

Fait intéressant Assez, le problème est que vous utilisez la même variable plus d'une fois. Si vous modifiez le code à ceci:

int i, j, k; 
i=j=k=5; 
printf("%i%i%i",i,j++,++k); 

Cela fonctionne comme prévu. Je pense que lorsque vous utilisez la même variable, l'ordre des opérations est chamboulé.

1

Vous accédez à et modifiez une valeur dans un sequence point (en le modifiant deux fois, en fait). Dans un point de séquence, vous ne pouvez pas être sûr de l'ordre des opérations. Par exemple, lorsque vous lisez l'appel de fonction de gauche à droite, il n'est pas garanti que les expressions sont évaluées dans cet ordre. Le premier i peut être évalué en premier, ce qui donne 5. Le i ++ pourrait être évalué en premier, en incrémentant à 6 avant que les deux ++i et i ne soient évalués, et ainsi de suite.