C/C++题目--typedef与#define

本文探讨了C/C++中typedef、#define以及宏定义的区别和使用场景。从宏定义与操作符的区别开始,讨论了带参宏与带参函数的差异,以及typedef在用户定义类型上的作用。同时,文章分析了结构和联合的不同,并通过实例解释了如何正确定义和使用宏,包括swap函数和相互引用的结构。最后,解答了关于extern数组大小计算的问题,以及typedef声明结构类型的正确方式。
摘要由CSDN通过智能技术生成

题目:宏定义和操作符的区别。

【答案】

宏定义是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)在宏定义内部,所有参数的出现都必须用括号括起来,以便保护实参中任何低优先级的操作符不受宏扩展

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值