题目如下:
假设宏定义如下:
#define TOUPPER(c) ('a'<=(c)&&(c)<='z'?(c)-'a'+'A':(c))
设s是一个足够大的字符数组,i是int型变量,则以下代码段的输出是:
strcpy(s, "abcd"); i = 0; putchar(TOUPPER(s[++i]));
一开始简单的把宏的函数想象成了函数,怎么也算不到最后输出的“D”。
#define TOUPPER(c) ('a'<=(c)&&(c)<='z'?(c)-'a'+'A':(c))
#include<stdio.h>
#include<string.h>
int main(){
char s[] = "1" ;
strcpy(s, "abcd");
int i = 0;
putchar(TOUPPER(s[++i]));
return 0;
}
后面才发现对++i的理解和宏的理解不够到位。
用了宏之后的代码应该是这样的:
#define TOUPPER(c) ('a'<=(c)&&(c)<='z'?(c)-'a'+'A':(c))
#include<stdio.h>
#include<string.h>
int main(){
char s[] = "1" ;
strcpy(s, "abcd");
int i = 0;
putchar(('a'<=(s[++i])&&(s[++i])<='z'?(s[++i])-'a'+'A':(s[++i])));
return 0;
}
那么s[++i]的变化应该是这样的
'a'<=(s[++i])这时是s[1]
(s[++i])<='z'这时是s[2]
(s[++i])-'a'+'A'这时是s[3]了也就是d
而后再转换成大写输出D。
总结:
用宏定义需要把所有的语句换下来看,对于++i和i++这类需要更加注意。