Почему выход для «а» -80? - PullRequest
2 голосов
/ 22 марта 2010
#include<stdio.h>
#include<conio.h>
#define ABC 20
#define XYZ 10
#define XXX ABC - XYZ

void main()
{
    int     a;

    a = XXX * 10;

    printf("\n %d \n", a);

    getch();
}

Я думал, что вывод должен быть 100, но когда я увидел результат, я нашел вывод как -80. Когда я ставлю скобки как #define XXX (ABC-XYZ), тогда я получаю вывод как 100, но без скобок я получаю вывод как -80.

Ответы [ 4 ]

13 голосов
/ 22 марта 2010

Препроцессор - тупой зверь. Он работает на чисто текстовом уровне, независимо от того, что он делает с кодом семантически. Давайте посмотрим, что он делает в этом случае:

a = XXX * 10;

становится

a = ABC - XYZ * 10;

, который становится

a = 20 - 10 * 10;

что, очевидно, -80.

Что, вероятно, предполагалось, было

#define XXX (ABC - XYZ)

Это одна из причин, по которой макросы считаются злыми.

3 голосов
/ 22 марта 2010
a = XXX * 10;

перед компиляцией изменится на следующее:

a = 20 - 10 * 10;

, что соответствует -80

2 голосов
/ 22 марта 2010

Здесь XXX заменяется ABC-XYZ. это похоже на следующее

20 - 10 * 10

Таким образом, выход -80

2 голосов
/ 22 марта 2010

Это рассчитывается так,

20-10 * 10

Используйте фигурные скобки в макросе XXX.

#define XXX (ABC-XYZ)
...