#define是C语言中提供的宏定义命令,其主要目的是为程序员在编程时提供一定的方便,并能在一定程度上提高程序的运行效率,但学生在学习时往往不能 理解该命令的本质,总是在此处产生一些困惑,在编程时误用该命令,使得程序的运行与预期的目的不一致,或者在读别人写的程序时,把运行结果理解错误,这对 C语言的学习很不利。

宏的定义在程序中是非常有用的,但是使用不当,就会给自身造成很大的困扰。通常这种困扰为:宏使用在计算方面。
本例子主要是在宏的计算方面,很多时候,大家都知道定义一个计算的宏,对于编译和编程是多么的有用。现在定义有以下一个计算 “乘法” 的宏。
#include <stdio.h>
#define MUL(a) ((a)*(a)*(a))
int main(int argc,char *argv[])
{
int i = 10;
int sum = MUL(i);
printf("MUL(%d) = %d\n",i,sum);
return 0;
}
</stdio.h>
上面程序的这种做法对于非负数而言那就是没有问题的,比如,程序中的 变量 i=10,这个时候,调用宏得到的数据如下:
但是如何变量的数值是自加或者自减的操作的话,结果就不一样了。
假如我们将上面的程序变为下面这样的
#include <stdio.h>
#define MUL(a) ((a)*(a)*(a))
int main(int argc,char *argv[])
{
int i = 10;
int sum = MUL(++i);
printf("MUL(%d) = %d\n",i,sum);
return 0;
}
</stdio.h>
得到的结果并不是 11 * 11 *11 = 1331这个数据,而是 1872,这时候有人会问为什么?
得到宏的朋友或者了解过宏在计算方面的朋友就会知道,这除了是宏的问题,还是本身程序员编写这段代码的问题。当使用了 ++i 和 i++ 的时候,
要特别注意在宏中是全部使用 ++i或者i++的,变成的格式如下
MUL(i++) ((i++)*(i++)*(i++)) MUL(++i) ((++i)*(++i)*(++i))
上述的做法显然不是我们想要的计算结果,可能在我们程序中看到的是MUL(++i) 或者 MUL(i++),认为实际上是如下情况:
//当i的初始化数值为10的时候,进行i++的 MUL(i++)宏计算,即是:int i = 10;
//MUL(i ++)的数值计算结果相比是 10 * 11 * 12的,这是没有问题的,但是 i的值呢??是11吗??显然不是。 MUL(i++) = 10 * 11 *12;i = ??;
i的数值如下图所示
诚然,i的数值变成了 13,这是为什么呢??
那就是因为这个MUL(a)这个宏和程序员的 “自加自减” 操作所造成的。这里先普及一下 C/C++语言的 “自加自减” 操作:
//自加自减的操作
i++ 和 ++i ----> 这里的操作属于++后操作,可以替换成 i = i+1 的结果。
但是,当它赋值给一个变量的时候,表示的内容和含义就有不同: (假设i = 10)
1. sum1 = i++;
2. sum2 = ++i;
1中的sum1的数值就是 10, i为 11
2中的sum2的数值就是 11, i为 11
这是因为:
i++ 操作是 先赋值给 sum1后,自己在执行 i = i+1的操作
++i 操作是 先进行 i = i+ 1的操作,然后再赋值给sum2
这样得到的结果当然不同了,但是i最终的结果是要加1的,只不过是赋值给变量的时候会有不同
通过对自加自减的操作进行说明,不知道大家是否明白为什么了吗??
当 i = 10的时候,MUL(i++)就是为 (i++)*(i++)*(i++)的计算结果,考虑到C/C++的运算符结合性,
先计算第一个 i++,这是一个先计算后赋值的自加方式,那么这是后第一个 (i++)的数值待定为 10 ,那么第
二个的i是因为第一个数据的 (i++)起了作用而变化的,这时候第二个(i++)的数值为11,然后加1,这时候 根
据结合性,先计算前面两个数据,就是(i++) * (i++)的数值了,即为:10 * 11了,这时候的i数值是 12;
然后计算第三个 i++的数值,这时候第三个i++中的i数值为 12,计算后再加1,也就是说,10 * 11 * 12之后,
i= 12 的数值在进行i++变为 13了。所以 MUL(i++) = 10 * 11 * 12 = 1320。
另外,在进行++i的操作和上述的情况差不多,只不过是先做自加的运算,在进行赋值。
当 i = 10的时候,MUL(++i)实际上也为 (++i)*(++i)*(++i)的方式,这时候先计算第一个 (++i),这是一
个先计算后赋值的结合方式,那么 i = i+1 = 11;这时候准备计算第二个(++i)的时候,因为需要先计算后赋值,
所以 第二个 ++i 之后的数值为12,但是因为i属于同一个变量和属性,那么第一个i也会变成 12了,这时候结合性
考虑应该是计算前两个(++i)的结果,再与第三个(++i)计算,即(++i)*(++i) = 12 * 12;然后,我们计算第三个
(++i)的数值,由于前面第二个++i的i值,所以第三个++i即为 13,此时,12 * 12 * 13。
有人可能顾虑,为什么最后不是13 * 13 * 13的呢?那不是最后都是13吗?? ------》其实这种想法是错误的,
这必须先理解运算符的结合性。我们知道,当计算中遇到了括号的时候,我们先计算括号的内容,这是我们在数学中的惯性思维。但是对于计算机而言,计算机必须 有计算的优先级,也就是运算符的优先级问题。首先我们计算前面两个括号的内容,以为两个括号之间有乘号(*),所以计算前面两个(++i)之后,必须进行乘法计算,这就是优先级中的乘法计算,自左向右计算。所以结果变为了 12 * 12的最终结果在和第三个括号的(++i)计算,就是144 * (++ i) = 144 * 13;
所以MUL(++i)的结果如下:
总结:
慎用宏在计算方面的,但是宏的有点还是很多的,对于C语言来说,宏可以减少运行的时间。在C++中,宏由于不会对类型进行检查,安全性不够,所以建议使用const来
进行使用,这样可以保证类型一致。这是C/C++对宏的严谨性进行优化的结果。
以上所述是小编给大家介绍的C/C++中宏(#define)定义知识,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!
# c
# define
# 宏定义
# 宏
# 详解C++中typedef 和 #define 的区别
# 如何区分C++中的inline和#define宏
# C++中const与#define的利弊分析
# C/C++中的typedef和#define详解
# 浅谈C++/C关于#define的那些奇奇怪怪的用法
# 这是
# 第三个
# 这时候
# 第一个
# 第二个
# 值为
# 运算符
# 即为
# 小编
# 的是
# 都是
# 那就是
# 就会
# 是在
# 会有
# 是因为
# 也会
# 大家都
# 只不过是
# 就有
相关文章:
如何选择最佳自助建站系统?快速指南解析优劣
如何选择高效稳定的ISP建站解决方案?
如何快速生成高效建站系统源代码?
娃派WAP自助建站:免费模板+移动优化,快速打造专业网站
西安专业网站制作公司有哪些,陕西省建行官方网站?
专业制作网站的公司哪家好,建立一个公司网站的费用.有哪些部分,分别要多少钱?
建站之星安装路径如何正确选择及配置?
c# 在高并发下使用反射发射(Reflection.Emit)的性能
如何在阿里云部署织梦网站?
如何在IIS管理器中快速创建并配置网站?
临沂网站制作公司有哪些,临沂第四中学官网?
,在苏州找工作,上哪个网站比较好?
c# 服务器GC和工作站GC的区别和设置
C#如何使用XPathNavigator高效查询XML
安徽网站建设与外贸建站服务专业定制方案
建站之星如何修改网站生成路径?
北京网站制作公司哪家好一点,北京租房网站有哪些?
如何注册花生壳免费域名并搭建个人网站?
如何快速搭建高效简练网站?
如何快速打造个性化非模板自助建站?
建站之星在线客服如何快速接入解答?
山东云建站价格为何差异显著?
广平建站公司哪家专业可靠?如何选择?
公司网站的制作公司,企业网站制作基本流程有哪些?
Swift中switch语句区间和元组模式匹配
齐河建站公司:营销型网站建设与SEO优化双核驱动策略
弹幕视频网站制作教程下载,弹幕视频网站是什么意思?
c++如何打印函数堆栈信息_c++ backtrace函数与符号名解析【方法】
早安海报制作网站推荐大全,企业早安海报怎么每天更换?
如何通过FTP空间快速搭建安全高效网站?
教程网站设计制作软件,怎么创建自己的一个网站?
建站之星备案是否影响网站上线时间?
学校建站服务器如何选型才能满足性能需求?
内网网站制作软件,内网的网站如何发布到外网?
网站建设制作、微信公众号,公明人民医院怎么在网上预约?
南京做网站制作公司,南京哈发网络有限公司,公司怎么样,做网页美工DIV+CSS待遇怎么样?
测试制作网站有哪些,测试性取向的权威测试或者网站?
微信网站制作公司有哪些,民生银行办理公司开户怎么在微信网页上查询进度?
专业公司网站制作公司,用什么语言做企业网站比较好?
网站制作报价单模板图片,小松挖机官方网站报价?
免费公司网站制作软件,如何申请免费主页空间做自己的网站?
浅谈Javascript中的Label语句
建站主机是否等同于虚拟主机?
如何在Windows虚拟主机上快速搭建网站?
潮流网站制作头像软件下载,适合母子的网名有哪些?
表情包在线制作网站免费,表情包怎么弄?
网页制作模板网站推荐,网页设计海报之类的素材哪里好?
网站制作软件免费下载安装,有哪些免费下载的软件网站?
如何用狗爹虚拟主机快速搭建网站?
如何在西部数码注册域名并快速搭建网站?
*请认真填写需求信息,我们会在24小时内与您取得联系。