#include <iostream>
#include <cmath>
#define max(x,y) (x)>(y)? (x): (y)
int main() {
int i = 10;
int j = 5;
int k = 0;
k = max(i++,++j);
std::cout << i << "\t" << j << "\t" << k << std::endl;
}
Répondre
Non, ce n'est pas le cas.
Dans ce cas, la situation est enregistré par le fait que l'opérateur ?:
a un point de séquence immédiatement après l'évaluation de la première opérande (condition) et après que seulement une des deux expressions (deuxième ou troisième opérande) est évaluée . Votre code est équivalent à
...
bool c = i++ > ++j;
k = c ? i++ : ++j;
...
Aucun comportement indéfini ici.
En effet, sans un point de séquence, le conséquent pourrait être évalué en même temps que la condition; alors nous verrions des effets secondaires pour les conséquents (ou les substituts) qui n'ont pas été utilisés. – configurator
Eh bien, il y a certainement beaucoup de problèmes avec cela.
- max calculait réellement min
- opérateurs d'incrémentation sont doublés sur quel que soit le choix est sélectionné puisque vous utilisez un macro
- par incréments postfix/préfixe est tout simplement jeté à confondre, mais ne dispose pas d'un beaucoup d'incidence sur le problème.
Ce code produira les mêmes résultats à chaque exécution, donc non, ce n'est pas indéfini. Au cout:
i = 11
k = 7
j = 7
Cela ressemble à un mauvais problème de devoirs. :)
Vous plaisantez, ça me semble un bon travail de devoirs. Qu'est-ce que ça fait? Pourquoi? – TheJacobTaylor
Eh bien, c'est pourquoi j'ai mis le smiley sur celui-là. Surtout parce que ce n'était pas étiqueté "devoirs". :) – dpb
Non, ce n'est pas une question de devoirs. Cela a été demandé au premier tour d'un concours de codage local et j'ai marqué UB comme réponse. :( – missingfaktor
- 1. Que fait le code C# suivant?
- 2. quel sera le comportement de l'extrait de code suivant?
- 3. Comportement indéterminé en cas de dépassement de 64 bits
- 4. Est-ce que le code C++ valide est le suivant?
- 5. Pourquoi est-ce que j'obtiens NPE dans le code suivant?
- 6. Aide dans le code suivant
- 7. Où est le «type indéterminé»?
- 8. Que faire pour attendre un nombre indéterminé de tâches?
- 9. Que doit faire le code suivant et avec les explications
- 10. erreur dans le code suivant
- 11. Le code C suivant est-il sécurisé?
- 12. Comment comprendre le code C++ suivant?
- 13. Comment faire le code Linq/Lambda suivant?
- 14. Fichier IO doute dans le code suivant
- 15. Comment améliorer le code suivant dans PHP
- 16. Est-ce que le tapotement du champ de texte suivant peut déclencher le même comportement que la touche "Terminé"?
- 17. Boo: est le code suivant possible
- 18. pouvez-vous expliquer le code suivant
- 19. Comment implémenter GetExitCodeProcess dans le code suivant?
- 20. Comment écrire un XSLT pour transformer XML suivant dans le code HTML suivant?
- 21. Convertir le code C# suivant en code java?
- 22. Quel est le code suivant equvalent pour C# Code
- 23. Sortie du code suivant .. Union
- 24. aider à comprendre le comportement étrange dans un code paresseux
- 25. C++: morceau suivant d'accidents Code
- 26. Quel est le bogue dans le code suivant?
- 27. Quel est le problème avec le code suivant?
- 28. Test de code unitaire qui appelle VirtualPathUtility.ToAbsolute
- 29. Que permet l'enregistrement SPF suivant?
- 30. ne trouvant que l'élément suivant
Votre macro 'max' est en fait une macro' min'. –
@James, La macro est en expansion d'une manière qui peut provoquer deux modifications à la même variable. Deux modifictaions à la même variable sans un point de séquence entre eux est UB, je pense. Je ne connais pas suffisamment les points de séquence pour être sûr que si l'opérateur: introduit un point de séquence ou pas. –
@James: Merci pour le pointage. Corrigé – missingfaktor