2011-01-26 4 views
0
int x = 0; 
x^=x || x++ || ++x; 

et la réponse pour x au dernier est 3. Comment analyser cette expression? peu confus à ce sujet. Merci beaucoup.c, bitwise, l'expression logique

+0

Voir: http://stackoverflow.com/questions/1895922/sequence-points-and-partial-order (la question suppose la connaissance des points de séquence) et http://stackoverflow.com/questions/4445706/post-increment -and-pre-increment-concept (voir la réponse acceptée). Non * exact * duplique, mais cet UB est "bien couvert" dans SO. –

+0

Voir aussi [Comportement non défini et points de séquence] (http://stackoverflow.com/questions/4176328/undefined-behavior-and-sequence-points). C'est du "C++ - faq" mais s'applique toujours en général. –

Répondre

7

Ce comportement est indéfini. Le résultat pourrait être n'importe quoi. C'est parce qu'il n'y a pas sequence point entre le ++x et le x ^=, donc il n'y a aucune garantie qui sera "fait" d'abord.

+0

parce que quoi? vous voulez dire x ++, ++ x et ainsi de suite ... cet ordre de calcul n'est pas défini, n'est-ce pas? –

+0

@Andy, en particulier, à travers le '^ ='. –

+3

Ce n'est pas vrai qu'il n'y a pas de points de séquence: l'opérateur '||' est toujours un point de séquence. Les deux seules modifications qui causent UB sont le dernier '++ x' et le' x^= '. – aschepler

2

C'est un comportement indéfini - vous pouvez donc obtenir la réponse que vous souhaitez.

+6

Eh bien, toute réponse que votre compilateur aimerait. –

-1

XOR 0 avec 0 est 0. Alors ++ deux fois est égal à 2. Néanmoins, comme indiqué dans les autres réponses, il n'y a pas de point de séquence. Donc, la sortie pourrait être n'importe quoi.

+0

-1: Non. Voir les autres réponses. –

+1

xor 0 avec 0 est actuellement _0_. '0,0-> 0, 0,1-> 1, 1,0-> 1, 1,1-> 0'. Ce n'est pas un bon début de réponse :-) – paxdiablo

+0

Fixe. Merci de l'avoir signalé. – Ron

0

Comme d'autres l'ont déjà noté, il s'agit d'un comportement indéfini. Mais pourquoi?

Lors de la programmation en C, il existe une différence inhérente entre une instruction et une expression. L'évaluation de l'expression devrait vous donner les mêmes résultats observables dans tous les cas (par exemple, (x + 5) + 2 est le même que x + (5 + 2)). D'autre part, les énoncés sont utilisés pour le séquençage des effets secondaires, c'est-à-dire qu'ils aboutissent généralement, disons, à l'écriture dans un emplacement de mémoire. Compte tenu de ce qui précède, les expressions peuvent être «imbriquées» en toute sécurité dans des instructions, alors que les instructions d'imbrication dans des expressions ne le sont pas. Par "sûr", je veux dire "pas de résultats surprenants".

Dans votre exemple, nous avons

x^=x || x++ || ++x; 

quel ordre l'évaluation s'y prendre? Depuis || fonctionne sur les expressions, cela ne devrait pas avoir d'importance si nous allons (x || x ++) || ++ x ou x || (x ++ || ++ x) ou même ++ x || (x || x ++). Cependant, puisque x ++ et ++ x sont des instructions (même si C leur permet d'être utilisées comme expressions), nous ne pouvons pas procéder par un raisonnement algébrique. Ainsi, vous devrez exprimer explicitement l'ordre des opérations, en écrivant plusieurs instructions.