Почему эта программа выводит 8?

#include <stdio.h>
#define abs(x) x > 0 ? x : -x

int main(void) {
  printf("%d\n", abs(abs(3 - 5)));
  return 0;
}

Почему программа выше выводит 8, а не 2, а программа ниже выводит 2?

#include <stdio.h>

int abs(int x) {
  return x > 0 ? x : -x;
}

int main(void) {
  printf("%d\n", abs(abs(3 - 5)));
  return 0;
}

person Mehmet Eren Aldemir    schedule 14.04.2017    source источник
comment
Изменить #define abs(x) x > 0 ? x : -x на #define abs(x) ((x) > 0 ? (x) : -(x))   -  person ouah    schedule 14.04.2017
comment
Программа выводит минус 8, а не 8.   -  person Sergey Kalinichenko    schedule 14.04.2017
comment
Недавно я заметил, что опубликовал код, который я изменил, если бы выражение было #define abs(x) (x > 0 ? x : -x), тогда оно вывело бы положительную восьмерку, @ dasblinkenlight, кстати, спасибо.   -  person Mehmet Eren Aldemir    schedule 14.04.2017


Ответы (1)


Короткий ответ: «потому что макрос не является функцией».

Длинный ответ заключается в том, что параметры макроса раскрываются в текст программы, поэтому компилятор C видит это длинное выражение:

3 - 5 > 0 ? 3 - 5 : -3 - 5 > 0 ? 3 - 5 > 0 ? 3 - 5 : -3 - 5 : -3 - 5 > 0 ? 3 - 5 : -3 - 5

В расширении отрицательный знак применяется к 3, а не к (3-5), что дает минус 8.

Хотя вы можете обойти эту проблему, заключив скобки вокруг x в определении макроса, определение встроенной функции было бы лучшим выбором.

person Sergey Kalinichenko    schedule 14.04.2017