Macros C #define

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.

define est juste une substitution de chaîne.

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