Вопрос

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

Это было полезно?

Решение

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

a = XXX * 10;

становится

a = ABC - XYZ * 10;

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

a = 20 - 10 * 10;

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

То, что, вероятно, было задумано, было

#define XXX (ABC - XYZ)

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

Другие советы

a = XXX * 10;

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

a = 20 - 10 * 10;

который оценивает -80

Он рассчитывает, как это,

20-10*10

Используйте скобки на макросе xxx.

#define XXX (ABC-XYZ)

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

20 - 10 * 10

Итак, выход -80

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top