2010-09-29 21 views
2

La sortie du code suivant est "321" sans guillemets. Pourquoi pas "123"?C++ Références Puzzle: Ma sortie apparaît inversée. Pourquoi?

#include <iostream> 
using namespace std; 

int& inc(int& start) 
{ 
return ++start; 
} 

int main() 
{ 
int i = 0; 
cout << inc(i) << inc(i) << inc(i) << endl; 
} 
+0

L'ordre dans lequel les sous-expressions sont évaluées n'est pas spécifié dans la norme C++. – sellibitze

+0

Dans ce cas, il va de droite à gauche, débogage et vous verriez les appels !! – DumbCoder

Répondre

4

Votre code invoque un comportement non spécifié parce que l'ordre d'évaluation des arguments de operator<< est non spécifiée

appels à operator<< modifient la même variable. N'écrivez pas un tel code.

Remarque: Notez que le code n'entraîne pas de comportement indéfini car il existe des points de séquence (au moins un appel de fonction) entre lorsque i est modifié et lorsqu'il est lu '.

+2

Est-ce que cela implique ou non un comportement non défini? :) –

+0

Non défini, non. Non spécifié, oui. Plus de lecture ici (http://www.devx.com/tips/Tip/12684) –

+0

@Eli: appel de fonction est en effet un point de séquence (note 'opérateur <<' est une fonction surchargée), donc il ne invoque pas Comportement indéfini –