宏定义的小问题,为什么输出是D

最后一行s[++i],不应该是s【1】吗,应该输出B,为什么会输出D呢

#include<stdio.h>
#include<stdlib.h>
#define TOUPPER(c) ('a'<=(c)&&(c)<='z'?(c)-'a'+'A':(c))

void main()
{
char s[5];
strcpy(s, "abcd");
int i = 0;
putchar(TOUPPER(s[++i]));
} 

这个道理很简单,因为宏只是机械的文本替换,每次遇到c都会替换成s[++i]
而你的表达式出现了好几次c,所以最后相当于
putchar(('a'<=(s[++i])&&(s[++i])<='z'?(s[++i])-'a'+'A':(s[++i])));

#include<stdio.h>
#include<stdlib.h>
#define TOUPPER(c) ('a'<=(c)&&(c)<='z'?(c)-'a'+'A':(c))

int main()
{
char s[5];
strcpy(s, "abcd");
int i = 0;
char ch = s[++i];
putchar(TOUPPER(ch));
} 

这样就是b