题目来自浙大翁凯老师mooc -> 12.2 编译预处理和宏 -> 练习
题目描述如下:
假设宏定义如下:
#define TOUPPER(c) ('a'<=(c)&&(c)<='z'?(c)-'a'+'A':(c))
设s是一个足够大的字符数组,i是int型变量,则以下代码段的输出是:
strcpy(s, "abcd"); i = 0; putchar(TOUPPER(s[++i]));
因此按照宏定义,写出如下代码验证:
#include <stdio.h>
#include <string.h>
#define TOUPPER(c) ('a'<=(c)&&(c)<='z'?(c)-'a'+'A':(c))
int main()
{
int i;
char s[20] = {0};
strcpy(s, "abcd");
i = 0;
putchar(TOUPPER(s[++i]));
return 0;
}
其中输出行按宏定义,等价于
putchar('a'<=(s[++i])&&(s[++i])<='z'?(s[++i])-'a'+'A':(s[++i]));
在这个过程中,共引用(遇到)了3次s[++i],每次都将使i递增1(如下图标注的1st、2nd、3rd)
putchar('a'<=(s[++i]) /*1st*/ &&(s[++i]) /*2nd*/ <='z'?(s[++i]) /*3rd*/ -'a'+'A':(s[++i]));
故最终输出之时,i已经递增为4,即putchar(s[4]-'a'+'A']),故输出应为D。
以上内容仅为本人作为初学者的一点思考,如有谬误还请指出!