Let us make a simpler code version doing almost the same: (to avoid stdio.h which includes a lot of macros)
#define A -B
#define B -C
#define C 5
int main(void)
{
int a = A;
return 0;
}
Now, let us see the result after macro expansion
arjun@localhost:~$ gcc -E macro.c
# 1 "macro.c"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "/usr/include/stdc-predef.h" 1 3 4
# 1 "<command-line>" 2
# 1 "macro.c"
int main(void)
{
int a = - -5;
return 0;
}
Hope that explains it -- after macro expansion, preprocessor inserts white space and thus prevent any addition of tokens being created.