面试问题5:const 与 define 宏定义之间的区别
2016-03-28 19:34
239 查看
问题描述:const 与 define 宏定义之间的区别
(1) 编译器处理方式不同
define宏是在预处理阶段展开;
const常量是编译运行阶段使用;
(2) 类型和安全检查不同
define宏没有类型,不做任何类型检查,仅仅是展开;
const常量有具体的类型,在编译阶段会执行类型检查;
(3) 存储方式不同
define宏仅仅是展开,有多少地方使用,就展开多少次,不会分配内存;
const常量会在内存中分配(可以是堆中也可以是栈中);
利用宏的优点:
1)让代码更简洁明了
一般来说,宏的名字更要注重有明确直观的意义,有时宁可让它长点。
2)方便代码维护
对宏的处理,在编译过程中称为“预处理”。也就是说在正式编译前,编译器必须先将代码出现的宏,用其相应的宏值替换,这个过程有点你我在文字处理软件中的查找替换。所以在代码中使用宏表达常数,归根结底还是使用了立即数,并没有明确指定这个量的类型。
利用const:
常量定义的格式为:
const 数据类型 常量名 = 常量值;
而const定义的常量具有数据类型,定义数据类型的常量便于编译器进行数据检查,使程序可能出现错误进行排查。常量必须一开始就指定一个值,然后,在以后的代码中,我们不允许改变此常量的值。
define定义表达式时要注意“边缘效应”,例如如下定义:
#define N 2+3 //我们预想的N值是5,我们这样使用N,int a = N/2; //我们预想的a的值是2.5,可实际上a的值是3.5原因在于在预处理阶段,编译器将 a = N/2处理成了 a = 2+3/2;这就是宏定义的字符串替换的“边缘效应”因此要如下定义:#define N (2+3)
举例:
GCC运行结果:
(1) 编译器处理方式不同
define宏是在预处理阶段展开;
const常量是编译运行阶段使用;
(2) 类型和安全检查不同
define宏没有类型,不做任何类型检查,仅仅是展开;
const常量有具体的类型,在编译阶段会执行类型检查;
(3) 存储方式不同
define宏仅仅是展开,有多少地方使用,就展开多少次,不会分配内存;
const常量会在内存中分配(可以是堆中也可以是栈中);
利用宏的优点:
1)让代码更简洁明了
一般来说,宏的名字更要注重有明确直观的意义,有时宁可让它长点。
2)方便代码维护
对宏的处理,在编译过程中称为“预处理”。也就是说在正式编译前,编译器必须先将代码出现的宏,用其相应的宏值替换,这个过程有点你我在文字处理软件中的查找替换。所以在代码中使用宏表达常数,归根结底还是使用了立即数,并没有明确指定这个量的类型。
利用const:
常量定义的格式为:
const 数据类型 常量名 = 常量值;
而const定义的常量具有数据类型,定义数据类型的常量便于编译器进行数据检查,使程序可能出现错误进行排查。常量必须一开始就指定一个值,然后,在以后的代码中,我们不允许改变此常量的值。
define定义表达式时要注意“边缘效应”,例如如下定义:
#define N 2+3 //我们预想的N值是5,我们这样使用N,int a = N/2; //我们预想的a的值是2.5,可实际上a的值是3.5原因在于在预处理阶段,编译器将 a = N/2处理成了 a = 2+3/2;这就是宏定义的字符串替换的“边缘效应”因此要如下定义:#define N (2+3)
举例:
#include <bits/stdc++.h> #define N 2+3 using namespace std; int main() { double ans = N/2.0; printf("%lf\n" ,ans ); }
GCC运行结果:
相关文章推荐
- .NET面试题解析(07)-多线程编程与线程同步 (转)
- 面试问题3:给一个单链表,怎么判断是否有环
- 面试问题2:给一个5G的大文件,保存的数据为32位的整型,找到所有出现次数超过两次的数字
- 面试问题1:给一个无序数组,找到其中位数。
- 剑指offer-面试题13:在O(1)时间删除链表结点
- java 面试总结
- java 面试总结
- 面试题之实现3^100次方和大整数的相乘
- 【LeetCode】Best Time to Buy and Sell Stock 程序员炒股 part.1
- 【剑指Offer学习】【面试题40:数组中仅仅出现一次的数字】
- 面试中的 10 大排序算法总结
- PHP面试题目搜集
- 码农小汪-Hibernate学习4-关联关系映射many-to-one,many-to-one,one-to-many
- 笔/面试题1--同友笔试
- 腾讯2016春季实习生(技术运营岗)招聘电话面试题汇集。
- 程序员学习编程需要攻克的8个障碍
- 关于一道PHP面试题的解法
- 安卓面试题
- 更一份微信的面试题
- 来自一个码农的面试感慨