其实这个是困惑了我好久的问题,没想到在上机课做到的题里找到了答案——我的困惑是:#define与const到底有什么区别。

题目:

 代码如下 复制代码

#define N 2

#define M N 1

#define NUM 2*M 1

main( )

{ int i;

for(i=1;i<=NUM;i ) printf(“%dn”,i);

}

该程序中的for循环执行的次数是( )

A) 5 B) 6 C) 7 D) 8

答案是6,跑过以后怎么都不理解,这是因为忽略了#define的重大不同。

#define进行的其实是简单的代入, 换句话说,NUM去找了M的表达式,把M的表达式代入,得出2*N 1 1,接着再去找N是多少,结果是2*2 1 1,因此等于6,而变量的话,毫无疑问则是进行了运算之后得出了的结果。

补充

1.简单的define定义

 代码如下 复制代码

#define MAXTIME 1000

一个简单的MAXTIME就定义好了,它代表1000,如果在程序里面写

if(i

编译器在处理这个代码之前会对MAXTIME进行处理替换为1000。

这样的定义看起来类似于普通的常量定义CONST,但也有着不同,因为define的定义更像是简单的文本替换,而不是作为一个量来使用,这个问题在下面反映的尤为突出。

2.define的“函数定义”

define可以像函数那样接受一些参数,如下

 代码如下 复制代码

#define max(x,y) (x)>(y)?(x):(y);

这个定义就将返回两个数中较大的那个,看到了吗?因为这个“函数”没有类型检查,就好像一个函数模板似的,当然,它绝对没有模板那么安全就是了。可以作为一个简单的模板来使用而已。

但是这样做的话存在隐患,例子如下:

 代码如下 复制代码
#define Add(a,b) a b;

在一般使用的时候是没有问题的,但是如果遇到如:c * Add(a,b) * d的时候就会出现问题,代数式的本意是a b然后去和c,d相乘,但是因为使用了define(它只是一个简单的替换),所以式子实际上变成了

c*a b*d

另外举一个例子:

 代码如下 复制代码
#define pin (int*);

pin a,b;

本意是a和b都是int型指针,但是实际上变成int* a,b;

a是int型指针,而b是int型变量。

这是应该使用typedef来代替define,这样a和b就都是int型指针了。

所以我们在定义的时候,养成一个良好的习惯,建议所有的层次都要加括号。

3.宏的单行定义

 代码如下 复制代码

#define A(x) T_##x

#define B(x) #@x

#define C(x) #x

我们假设:x=1,则有:

A(1)------〉T_1

B(1)------〉'1'

C(1)------〉"1"

(这里参考了 hustli的文章)

3.define的多行定义

define可以替代多行的代码,例如MFC中的宏定义(非常的经典,虽然让人看了恶心)

 代码如下 复制代码
#define MACRO(arg1, arg2) do { /

/* declarations */ /

stmt1; /

stmt2; /

/* ... */ /

} while(0) /* (no trailing ; ) */

关键是要在每一个换行的时候加上一个"/"

c语言 define和int,C语言中define与const的用法区别分析相关推荐

  1. c语言中{的作用,C语言中Static和Const关键字的作用

    C语言中Static和Const关键字的作用 程序的局部变量存在于(堆栈)中,全局变量存在于(静态区 )中,动态申请数据存在于(堆)中.那么关于C语言中Static和Const关键字的作用,你了解多少 ...

  2. c语言define的小数点,C语言中#define用法总结

    1.简单的宏定义 #define 标识符 替换列表(替换列表可以是数,字符串字面量,标点符号,运算符,标识符,关键字,字符常量.注意:替换列表是可以为空的) 典型错误: #define N = 100 ...

  3. c语言while函数作用,C语言中while /do while语句用法

    在c语言中do while与while与我们学的vb,asp.net都一样的,下面我来介绍一下关于C语言中while /do while语句基于用法. C语言while语句的用法 while语句的一般 ...

  4. c语言中and和or的用法区别,Lua中and和or的用法和记忆方法

    Lua中and 和 or是逻辑运算符,对他们的操作数而言false和nil为false,其他均为true Lua官方手册中and 和 or的解释: The conjunction operatoran ...

  5. c语言 编译开关用法,C语言中define的使用方法

    C语言中define的使用方法 学习了这么多年C语言,说实话对宏自以为了如指掌了,没想到看内核代码的时候还是那么吃力,设备驱动代码中有很多这样或者那样的宏定义,各种define都有哪些学习方法呢?以下 ...

  6. c语言数组中define,c语言中#define的用法

    c语言中#define的用法 C语言中,可以用 #define 定义一个标识符来表示一个常量.其特点是:定义的标识符不占内存,只是一个临时的符号,预编译后这个符号就不存在了. 预编译又叫预处理.预编译 ...

  7. c语言define需要分号骂,C语言中define的用法

    C语言中define的用法 2016-01-06 15:00  来源: 博客园 define是C语言中的预处理命令,它用于宏定义,可以提高源代码的可读性,为编程提供方便. 预处理命令以"#& ...

  8. 单片机c语言的define,单片机C语言中define的妙用

    单片机C语言中define的妙用 最近一款产品调试时发现了问题,在一起检查一个小伙伴的C程序.问题不大,但暴露了一点问题. 比如:PORTB=0x23; //他的意思是把第5和第2位置1 可是你能一下 ...

  9. #define c# 报错_c语言中#define的用法

    c语言中#define的用法 C语言中,可以用 #define 定义一个标识符来表示一个常量.其特点是:定义的标识符不占内存,只是一个临时的符号,预编译后这个符号就不存在了. 预编译又叫预处理.预编译 ...

最新文章

  1. gettimezone_Java日历getTimeZone()方法与示例
  2. mysql+last_query_cost_辛星简译MySQL中的last_query_cost_MySQL
  3. c#中高效的excel导入oracle的方法
  4. 13. 在后台配置主题
  5. Python爬虫-什么是爬虫?
  6. 认识直动、先导式电磁阀
  7. python雷达图的相似度_python画雷达图
  8. 阿里P7、P8、P9级别需要多少年的工作经验,还是因能力而定?
  9. 常见的股票量化交易软件主要有哪几种类型?
  10. 客运综合管理系统项目解析-安全检查(模块)-车辆安检情况查询
  11. 武汉市计算机类中专学校排名,武汉中职中专学校一览表 2021最新排名
  12. 审阅模式中word保存不了
  13. c# sqlite 批量修改
  14. Java图像处理最快技术:ImageJ 学习第一篇
  15. Linux 之父是个果粉:给自用 M2 Mac 装上 Fedora Linux,除图形加速和 Chrome 都搞定了...
  16. 《黑客与画家》-读书笔记
  17. PS手绘滤镜插件:Alien Skin Snap Art 4 for Mac对系统的要求
  18. Debian Linux 的安装
  19. 【ArrayList源码】ArrayList构造方法
  20. 拾玉第二期人民币基金完成超额募集,金额超30亿元

热门文章

  1. 牛郎织女都去约会了,你还窝在家里?熬夜准备的惊喜送给光棍的你!
  2. C语言实现的滑动平均滤波算法
  3. mvc 第一次打开界面慢_Slowly App 收信像从前一样慢
  4. 告别从删库到跑路,linux回收站实现
  5. 将文献的bibtex引用格式批量转换为bibitem格式参考文献
  6. 字符常量和字符变量(c语言)
  7. 基于功耗预算的实时绘制
  8. Oracle之case when用法
  9. idea Mac 快捷键
  10. Chrome| 汇总