2017-10-20 15 views
0

Je suis confronté à un problème pour comprendre comment fonctionne #define.Comment #define fonctionne dans la programmation lorsque define a une valeur avec l'opérateur?

#include<stdio.h> 
#define x 6+3 
int main(){ 

int i; 
i=x; //9 
printf("%d\n",i); 
i=x*x; //27 
printf("%d\n",i); 
i=x*x*x; //45 
printf("%d\n",i); 
i=x*x*x*x; //63 
printf("%d\n",i); 

return 0; 
} 

Si je #define x 6+3 la sortie est 9 27 45 63

Si je #define x (6+3) la sortie est 9 81 729 6561

+7

Pour en savoir plus, je vous suggère de faire l'expansion macro main pour comprendre ce qui se passe. – user694733

+0

#define fonctionne par substitution de texte. –

+0

De commentaire ci-dessus, pour vous de commencer 'i = x * X' ->' i = 6 + 3 * 6 + 3' –

Répondre

5

#define remplace simplement le jeton de caractères (dans votre cas x) avec ce que vous l'avez défini. Ainsi, votre exemple ressemblerait à ceci après le préprocesseur a fait son travail:

#include<stdio.h> 
#define x 6+3 
int main(){ 

    int i; 
    i=6+3; //9 
    printf("%d\n",i); 
    i=6+3*6+3; //27 
    printf("%d\n",i); 
    i=6+3*6+3*6+3; //45 
    printf("%d\n",i); 
    i=6+3*6+3*6+3*6+3; //63 
    printf("%d\n",i); 

    return 0; 

} 

Et si vous regardez dessus vous voyez pourquoi par exemple le deuxième exemple est 27 au lieu de 81 (* avant +). Par contre, si vous écrivez (6 + 3), ce sera 9 * 9 et c'est ce que vous attendez d'elle.

+3

"* remplace la variable *" est quelque peu trompeur, car le pré-processeur *** ne sait pas ** à propos des "variables". La dernière phrase devrait mieux lire "remplace le jeton de personnage". – alk

+0

Oh ouais tu as raison. THX. – Rafiwui

2

Il s'agit d'un cas de priorité d'opérateur . Vous pouvez étudier à ce sujet un peu. Je décris sur ce sujet comme suit.

Si vous utilisez

#define x 6+3 

puis

x = 6+3= 9 

x*x = 6+3 * 6+3 = 6+18+3 = 27 (as * has higher precedence as operator than + ; so 3*6 will be evaluated earlier) 

et va de la même suite.

Maintenant, si vous utilisez

#define x (6+3) 

puis

x = (6+3) = 9 

x*x = (6+3)*(6+3) = 9*9 = 81 

et va de la même suite.

Donc, ma suggestion est d'utiliser des crochets toujours pour une meilleure lisibilité et compréhension.

1

Le nom de la macro est remplacé par le contenu. Cela signifie que

#define x 6+3 
x*x*x*x = 6+3*6+3*6+3*6+3 = 6+18+18+18+3 

lorsque vous définissez x comme (6 + 3) - (6 + 3) inséré. Cela signifie que

#define x (6+3) 
x*x*x*x = (6+3)*(6+3)*(6+3)*(6+3) = 9*9*9*9 

En savoir plus sur C Preprocessor and Macros

1

extension macro est un texte de remplacement. Alors

#define x 6 + 3 
#define y (6+3) 

Judgment rend le présent

printf("%d %d\n", x , y);  // 6 +3 , (6+3) is 9 and 9 
printf("%d %d\n", x *x , y * y); // 6 + 3 * 6 + 3, (6+3) * (6+3) 
            // 6 + 18 + 3 , 9  * 9 
            //  27  , 81