关于C语言的问题。

麻烦详细解答,谢谢!
2025-02-25 03:06:23
推荐回答(2个)
回答1:

先说明一点,C语言中宏和函数有些差别,宏是代码展开。第一个例子,DOUBLE(1+2)这个调用实际上是2*1+2,看,x被展开为1+2,然后根据运算符的规则(实际上应该说是优先级),先运算2*1,再加上2,所以结果是4。第二个例子就更简单了,同样是展开,TOUPPER(s[++i])这个调用,实际上它的代码展开就是:('a'<=(s[++i])&&(s[++i])<='z'?(s[++i])-'a'+'A':(s[++i])),看你的基础不错,这行代码应该能理解,问题的关键在于宏是代码展开,展开后的代码,变量i被加了3次(最后那个++没有执行),当字符数组s的下标是3时,对应的是字母d,再经过宏的大小写转换,结果就是大写字母D。

回答2:

1.
宏展开为:
2*1+2
值为4。

2.
宏展开为:
putchar('a'<=(s[++i])&&(s[++i])<='z'?(s[++i])-'a'+'A':(s[++i]))
从判断到最后输出,(s[++i])共被引用了三处。所以输出时i的值先自增为3然后再引用。
所以最后的输出就是D。