つっこみどころはいっぱいある。

あいかわらずマクロの定義が実行時メモリに確保されているかのような図。

bをグローバル変数にしていること。

bに意味もなく1の初期値を与えていること。

なぜわざわざ switch(A+b)ではなく、switch(b=A+b)としたのか?
代入に意味を持たせたいなら、

b=A+b;
switch(b) {..

とすればいいのではないのか?

#define A 1
int b = 1;
:
switch(2 * (b=A+b) + (b-4)) {
:
}

の場合はどういう順で解釈するのか?
switch文の後のbの値が何かわかる?