2010-11-07 5 views
2

L'optimisation du compilateur provoque-t-elle un problème avec ce type de code? Plus précisément, peut-on répondre aux auto-incréments dans le bon ordre?Optimisation du compilateur et incréments

uint result = (array[i++] << 16) | (array[i++] << 8) | array[i++]; 

Répondre

4

Yes; this is specified.

Le spec says:

Opérandes dans une expression sont évalués de gauche à droite. Pour exemple, dans F(i) + G(i++) * H(i), méthode F est appelé en utilisant l'ancienne valeur de i, puis méthode G est appelée à la ancienne valeur de i, et, enfin, la méthode H est appelée avec la nouvelle valeur de i. Ceci est distinct de et sans rapport avec la priorité d'opérateur .

+0

Ceci est vrai que pour une seule modification i, voir ma réponse ci-dessous ... –

+0

@Andy: Faux. C'est toujours vrai. – SLaks

0

Non, je pense que vous modifiez l'objet (i) plusieurs fois entre les points de la séquence. IIRC ni bitwise ou, ni l'indexation de tableau sont des points de séquence. Vous n'êtes autorisé à modifier l'objet qu'une seule fois, sinon le comportement n'est pas spécifié ou indéfini.

REMARQUE. Ce n'est pas forcément un problème avec l'optimiseur, ce n'est pas légal.

Edit: Voici un lien sur les points de séquence - http://msdn.microsoft.com/en-us/library/d45c7a5d(VS.80).aspx

+0

Mauvais. ** Ceci est C#, pas C++ **. – SLaks

+0

DOH! Mon erreur, j'ai mal lu l'étiquette. Mais ça va mordre n'importe qui qui passe de C# à C++, donc je ne le ferais pas. :-) –