Voici ce que j’ai et je me demande comment cela fonctionne et ce qu’il fait réellement.
#define NUM 5 #define FTIMES(x)(x*5) int main(void) { int j = 1; printf("%d %d\n", FTIMES(j+5), FTIMES((j+5))); }
Il produit deux entiers: 26 et 30.
Comment ça fait ça?
La raison en est que votre macro étend l’impression à:
printf("%d %d\n", j+5*5, (j+5)*5);
Sens:
1+5*5 and (1+5)*5
Comme il n’a pas encore été mentionné, la solution du problème est la suivante:
#define FTIMES(x) ((x)*5)
Les parenthèses autour de x
dans l’extension de macro empêchent le problème de l’associativité de l’opérateur.
La réponse à votre question après cela est l’ordre des opérations:
FTIMES (j + 5) = 1 + 5 * 5 = 26
FTIMES ((j + 5)) = (1 + 5) * 5 = 30
Le pré-processus du compilateur effectue simplement une substitution de FTIMES partout où il le voit, puis comstack le code. Donc, en réalité, le code que voit le compilateur est le suivant:
#define NUM 5 #define FTIMES(x)(x*5) int main(void) { int j = 1; printf("%d %d\n", j+5*5,(j+5)*5); }
Ensuite, en tenant compte des préférences de l’opérateur, vous comprendrez pourquoi vous obtenez 26 et 30.
Et si vous voulez le réparer:
#define FTIMES(x) ((x) * 5)
le pré-processeur substitue toutes les occurrences NUM dans le code par 5 et tous les FTIMES (x) par x * 5. Le compilateur comstack ensuite le code.
C’est juste une substitution de texte.
Ordre des opérations.
FTIMES (j + 5) où j = 1 est évalué à:
1 + 5 * 5
Lequel est:
25 + 1
= 26
En faisant FTIMES ((j + 5)), vous l’avez changé en:
(1 + 5) * 5
6 * 5
30