Comment #define fonctionne? Résultat étrange pour CUBE (y) y * (y * y)

#include #include #define CUBE(y)y*(y*y) main() { int j; j = CUBE(-2+4); printf("value of j = %d",j); getch(); } 

La sortie de ce code est -26 . Je veux juste savoir comment ce code donne -26 en sortie. Comment #define fonctionne dans ce code. Je sais que la valeur de correction permanente #define pour une variable ou une méthode, mais comment cela fonctionne pour CUBE ici. Quelqu’un peut-il s’il vous plaît décrire cette étape par étape, les moyens de manière simple.

Cela fait:

 j = -2 + 4 * (-2 + 4 * -2 + 4) 

Une définition plus correcte de CUBE serait

 #define CUBE(y) ((y)*(y)*(y)) 

Vous devriez le découvrir vous-même en utilisant l’ -E :

gcc test.c -E

 # 1 "test.c" # 1 "" # 1 "test.c" main() { int j; j = -2+4*(-2+4*-2+4); // <-- Check this substitution printf("value of j = %d",j); getch(); } 

Pour les numéros de cube, vous devriez utiliser () pour changer la priorité et l'ordre d'évaluation: -

#define CUBE(y) (( y )*( y )*( y ))

qui donnera après avoir utilisé le drapeau -E :

j = (( -2+4 )*( -2+4 )*( -2+4 ));

Je sais que #define une valeur de correction permanente pour une variable ou une méthode

Vous ne pouvez pas savoir cela parce que c’est faux . Le préprocesseur fonctionne par remplacement de jeton . Chaque fois qu’il voit la séquence de jetons CUBE(some tokens) il le remplace par

  some tokens * ( some tokens * some tokens ) 

Maintenant, remplacez vous-même certains jetons par -2+4 et faites le calcul.

Le préprocesseur ne sait même pas ce qu’est une variable, un object ou une méthode. Il fonctionne uniquement en termes de jetons de prétraitement (petits morceaux de caractères; voir la norme ISO C pour plus de détails).

Il s’agrandit tel quel:

 -2+4*(-2+4*-2+4) = -2 +4(-6)= -26 

Pour le fixer, entourez y avec ()

 #define CUBE(y) ((y)*(y)*(y)) 

alors vous aurez:

 ((-2+4) * (-2+4) * (-2+4))