题目:宏定义和操作符的区别。
【答案】
宏定义是C语言开始提供的3种预处理功能的其中一种。这3种预处理分别是:宏定义、文件包含和条件编译。宏定义是一个一环操作,不做计算和表达式求解,不占用内存和编译时间。
题目:以下宏MIN,输出结果为多少。
#define MIN(a,b) (a)<(b)?(a):(b)
int main()
{
int a =2;
int b =4;
int min = MIN(++a, b);
printf("%d",min);
return 0;
}
【答案】
4
【答案】
因为宏Min作为模拟函数,编译器会把它识别为(++a)<(b)?(++a):(b),a自加满足条件后,则还会自加一次。
题目:用宏定义写出swap(x,y),即交换两数。
【答案】
#define swap(x, y) (x)=(x)+(y);(y)=(x)–(y);(x)=(x)–(y);
题目:我想定义一些函数式的宏,例如:
#define square(x) x*x
但它们并不总是正确的。为什么?
【答案】
宏扩展是纯粹的文本扩展。为了避免意外,在定义函数式的宏的时候,请记住下边所列的三条规则。
(1)宏扩展必须使用括号,以便保护表达式中低优先级的操作符。例如对于上边问题中(错误)的square()宏,调用
1/square(n)
会被扩展为
1/n*n
这等价于(1/n)*n。而你需要的是
1/(n*n)
在这里,问题出在结合性而不是优先级上,但效果是一样的。
(2)在宏定义内部,所有参数的出现都必须用括号括起来,以便保护实参中任何低优先级的操作符不受宏扩展