0
#include <stdio.h> 
#define abs(x) x > 0 ? x : -x 

int main(void) { 
    printf("%d\n", abs(abs(3 - 5))); 
    return 0; 
} 

Pourquoi le programme au-dessus de la sortie 8 et non 2 alors que le programme ci-dessous sort 2?Pourquoi ce programme sort-il 8?

#include <stdio.h> 

int abs(int x) { 
    return x > 0 ? x : -x; 
} 

int main(void) { 
    printf("%d\n", abs(abs(3 - 5))); 
    return 0; 
} 
+2

Modifier '#define abs (x) x> 0? x: -x' à '#define abs (x) ((x)> 0? (x): - (x))' – ouah

+0

Le programme [sorties négatives 8] (http://ideone.com/H434lj), pas 8. – dasblinkenlight

+0

J'ai récemment remarqué que j'ai posté le code que j'ai changé, si l'expression était '#define abs (x) (x> 0? x: -x)' alors il serait [sortie positive huit] (http: // ideone.com/7WY5Ie), @dasblinkenlight, merci d'ailleurs. –

Répondre

2

La réponse courte est "parce qu'une macro n'est pas une fonction".

Réponse longue est que les paramètres macro sont développés dans le texte du programme, de sorte que le compilateur C voit cette longue expression:

3 - 5 > 0 ? 3 - 5 : -3 - 5 > 0 ? 3 - 5 > 0 ? 3 - 5 : -3 - 5 : -3 - 5 > 0 ? 3 - 5 : -3 - 5 

Dans l'expansion, signe négatif s'applique à 3, pas (3-5), ce qui donne négatif 8.

Bien que vous puissiez contourner ce problème en plaçant des parenthèses autour de x dans la définition de macro, définir une fonction en ligne serait un meilleur choix.