Определить в C не работает, когда ввод составной

Проблемы с использованием define в C. Хорошо работает, когда я вызываю OP(9), но когда я вызываю OP(7+2), я получаю 23. Почему?

 #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;

 }

Почему печатает 23, а не 81?


person MM PP    schedule 09.02.2017    source источник
comment
Используйте скобки. Это должен быть дублирующий вопрос.   -  person jxh    schedule 09.02.2017
comment
Скобки — или их отсутствие. Посмотрите на 7 + 2*7 + 2 — это 23. Если вы хотите (7+2)*(7+2), добавьте круглые скобки: #define OP(x) ((x)*(x)) — все!   -  person Jonathan Leffler    schedule 09.02.2017
comment
...но когда я звоню OP(7+2)... Вы не можете звонить OP(7 + 2). OP — это макрос, а не функция. Макросы вызывать нельзя. Их можно только заменить/заменить. Остальное следует.   -  person AnT    schedule 09.02.2017


Ответы (1)


Вы должны заключить x в круглые скобки, чтобы установить приоритет. Однако также важно заключать все выражение в круглые скобки.

#define OP(x) ((x)*(x))
person Ryan    schedule 09.02.2017
comment
А еще лучше: #define OP(x) ((x)*(x)) - person David Ranieri; 09.02.2017
comment
переходя от -1 к +1 для исправления, причину можно увидеть, запустив эти строки #define ABS(a) (a) < 0 ? -(a) : (a) printf("ABS(-3) - 1): %d\n", ABS(-3) - 1); - person Kami Kaze; 09.02.2017