2017-02-09 4 views
0

Problèmes en utilisant define en C. Fonctionne bien quand j'appelle OP(9), mais quand j'appelle OP(7+2) je reçois 23. Pourquoi?Définir en C ne fonctionne pas lorsque l'entrée est composite

#include<stdio.h> 
#include<stdlib.h> 

#define OP(x) x*x; 

int main() { 
int x,y; 

x = 2; 
y = OP(7+2); 
printf("%d", y); 

return 0; 

} 

Pourquoi imprimer 23 et pas 81?

+2

Utilisez des parenthèses. Cela doit être une question en double. – jxh

+1

Parenthèses - ou leur absence. Regardez '7 + 2 * 7 + 2' - c'est' 23'. Si vous voulez '(7 + 2) * (7 + 2)', ajoutez les parenthèses: '#define OP (x) ((x) * (x))' - tous! –

+1

"... mais quand j'appelle' OP (7 + 2) '..." Vous ne pouvez pas "appeler" 'OP (7 + 2)'. 'OP' est une macro, pas une fonction. Les macros ne peuvent pas être "appelées". Ils ne peuvent être substitués/remplacés. Le reste suit. – AnT

Répondre

4

Vous devez envelopper x entre parenthèses afin de forcer la précédence. Cependant, il est également essentiel d'entourer l'expression entière entre parenthèses.

#define OP(x) ((x)*(x)) 
+0

Mieux encore: '#define OP (x) ((x) * (x))' –

+1

allant de -1 à +1 pour la correction, la raison peut être vu en exécutant ces lignes '#define ABS (a) (un) <0? - (a): (a) '' printf ("ABS (-3) - 1):% d \ n", ABS (-3) - 1); ' –