An@mik@ Ответов: 1

Вопрос о макросе в языке Си


Привет
может ли кто - нибудь сказать мне, как ans 11 входит в следующую программу
#include <stdio.h>
#include <conio.h>
#define SQR(x) (x * x)
void main()
{
  int a , b=3;
  clrscr();
  a=SQR(b + 2);
  printf("The value of B is %d",b);
  printf("\nThe ans of function is %d ",a);
  getch();
}


Что я уже пробовал:

когда я изменяю значение в a=SQR(b+3), выход равен 15
и
Я изменяю значение в a=SQR(b+4) выход равен 19
как же это выходило???

1 Ответов

Рейтинг:
7

OriginalGriff

#define это не макрос, а процессор подстановки текста.
Итак, когда вы пишете это:

#define SQR(x) (x * x)
a=SQR(b + 2);
Текст заменяется точно, и вы получаете это:
a=(b + 2 * b + 2);
как
a = b + (2 * b) + 2 = 3 + (2 * 3) + 2 = 3 + 6 + 2 = 11
Вот почему жизненно важно злоупотреблять скобками в #define заявления!
#define SQR(x) ((x) * (x))
void main()
{
  int a , b=3;
  clrscr();
  a=SQR(b + 2);
Даст вам то, что вы хотели.


CPallini

5.

KarstenK

Простой, но выдающийся пример проблем с использованием #define. Этого не произойдет при использовании функций.

An@mik@

прямо тогда, когда я делал ту же самую программу с функцией, она давала мне другой результат.

OriginalGriff

Это верно - потому что параметры функции полностью вычисляются перед вызовом функции.