Почему вывод для «А» составляет -80?
-
21-09-2019 - |
Вопрос
#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