LinuxForum.Fans
Тема

define - тонкости

Автор: Peter 6 сообщений 1597 просмотров
#339148

Здравствуйте!

Может ли кто-нибудь объяснить роль круглых скобок в #define?
Это же не макрос. Вот в проверочной программе результат
с CON1 правильный, а с CON2 - неправильный.

text

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define CON0 4096
#define CON1 (CON0/64)
#define CON2 CON0/64
int main(int argc,char **argv){
int n=128;
  if(argc>1)n=atoi(argv[1]);
fprintf(stdout,"%d %d %d  %d %d %d\n",CON1,n/CON1,n%CON1,CON2,n/CON2,n%CON2);
  return 0;
}

Пётр.

#339199
"Peter⇓" написал:
Это же не макрос.

это как раз и есть макрос ;)

#339218
"Peter⇓" написал:
Может ли кто-нибудь объяснить роль круглых скобок в #define?

ну бывают макросы с параметром, а бывают простые.

Вот пример макроса, который умножает два параметра

text
#define MUL(_X_, _Y_) ((_X_) * (_Y_))

int main() { return MUL(2,7); }

скобки нужны потому, что-бы приоритет операций на влиял. Т.е. MUL(2+2,2) развернётся в ((2+2)*2), и даст восемь, а не 6.

#339220
"Peter⇓" написал:
с CON1 правильный, а с CON2 - неправильный.
"Peter⇓" написал:
n%CON2

ну а тут всё просто: операции выполняются как хотят, т.к. вы не поставили скобки. Вот и получается ошибка в выражении n%4096/64, ибо компилятор решил сначала остаток на 4096 посчитать, а потом уже делить на 64. А не наоборот, как вы наверное хотели.

Скобок в макросах много не бывает. Ставьте их побольше.

#339227

Согласен, у меня для выявления минимального или максимального числа
и для абсолютной величины используются именно так определённые
макросы - в (). Я имел в виду, что здесь без параметров. Но теперь,
конечно, понятно, в чём дело - define не вычисляет результат, а просто
подставляет определение вместо названия туда, где оно встречается,
так что, с учётом порядка выполнение операций, его надо брать
в скобки. Как-то забыл, что это не оператор в смысле языка.

Пётр.

#339233
"Peter⇓" написал:
define не вычисляет результат, а просто
подставляет определение вместо названия туда, где оно встречается,

именно так.

Войдите или зарегистрируйтесь, чтобы ответить.