2010-02-27 5 views
4
#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; 
} 
+4

Votre macro 'max' est en fait une macro' min'. –

+0

@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. –

+0

@James: Merci pour le pointage. Corrigé – missingfaktor

Répondre

12

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.

+0

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

4

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. :)

+1

Vous plaisantez, ça me semble un bon travail de devoirs. Qu'est-ce que ça fait? Pourquoi? – TheJacobTaylor

+0

Eh bien, c'est pourquoi j'ai mis le smiley sur celui-là. Surtout parce que ce n'était pas étiqueté "devoirs". :) – dpb

+0

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

Questions connexes