#define和const的区别
下面使用#define和const定义常量:
#define n_define 10 int main(int argc, char* argv[],int _version)
{
const int n_const=;
int *p=(int *)&n_const;
*p=;
printf("%d",*p);
printf("\n%d",n_define); return ;
}
上述代码所对应的汇编代码如下:
mov [ebp+var_4], 14h ;n_const的十六进制
lea eax, [ebp+var_4]
mov [ebp+var_8], eax ;int *p=(int *)&n_const
mov ecx, [ebp+var_8]
mov dword ptr [ecx], 1Eh ;*p=30
mov edx, [ebp+var_8]
mov eax, [edx]
push eax
push offset asc_432020 ; "%"
call printf
add esp,
push 0Ah ;n_define的十六进制
push offset aD ; "\n%d"
call printf
add esp,
汇编代码1-11行对应C++代码5-8行。从汇编代码可以看得出来,在底层const常量和变量没区别。也就是说const定义的是假常量,本质上还是个变量,只不过编译器限制了我们对const常量的修改。而由#define定义的则不同。汇编代码第12行可以看出,编译器已经偷偷做了“手脚”:编译器将n_define替换成了0Ah,而这一步替换是发生在预处理阶段。n_define所对应的20已经变成了二进制,且在指令里面是属于立即数了。所以如果对n_define进行&n_define将会出错。
换一种通俗易懂的说法是:const常量是编译器级别的常量,而#define常量则是真常量。
#define和const的区别的更多相关文章
- 宏定义define和const的区别
define和const都可以用来定义常量,define的格式为:#define 标识符 字符串,const在定义常量前面,const类型定以后不能被修改,区别主要有如下几点: 1.编译器处理方式不同 ...
- #define和const的区别(转)
这个区别用从几个角度来说: 角度1:就定义常量说的话:const 定义的常数是变量 也带类型, #define 定义的只是个常数 不带类型. 角度2:就起作用的阶段而言:define是在编译的预处理阶 ...
- c++中 #define和const的区别
来源参考:https://blog.csdn.net/yi_ming_he/article/details/70405364 这个区别用从几个角度来说: 角度1: 就定义常量说的话: const 定 ...
- PHP常量详解:define和const的区别
常量是一个简单值的标识符(名字).如同其名称所暗示的,在脚本执行期间该值不能改变(除了所谓的魔术常量,它们其实不是常量).常量默认为大小写敏感.通常常量标识符总是大写的. 可以用 define() 函 ...
- C++中define与const的区别
C++中不但可以用define定义常量还可以用const定义常量,它们的区别如下: 用#define MAX 255定义的常量是没有类型的,所给出的是一个立即数,编译器只是把所定义的常量值与所定义的常 ...
- PHP常量:define()和const的区别
常量,就是一个用于存储“不会(也不允许)变化的数据”的标识符.比如圆周率,在一定的应用场景中,就是一个固定的值(人为规定为某个值).常量默认大小写敏感.通常常量标识符总是大写的. (1)define( ...
- php define和const的区别
1.使用const使得代码简单易读,const本身就是一个语言结构,而define是一个函数2.const用于类成员变量的定义,一经定义,不可修改.3.Define不可以用于类成员变量的定义,可用于全 ...
- c++中typedef、define、const、inline之间的区别
1.typedef和#define的区别 typedef int* pInt; , b = ; const pInt p1 = &a; //p1是常量指针 pInt const p2 = &a ...
- #define和const的简单区别
面试常问:宏#define和const有什么区别? 1.编译器处理方式 define宏是在预处理阶段展开 const常量是在编译阶段使用 2.类型和安全检查不同 define宏没有类型,不做安全检查, ...
随机推荐
- freemarker入门实例与源码研究准备工作
首先去freemarker官网下载源码jar包,本文是基于freemarker-2.3.21.tar.gz进行研究的.解压源码包,找到freemarker的源码部分导入eclipse工程中.需要注意的 ...
- XXL-Job路由策略
企业项目中所有的任务调动通过XXL-Job 去管理调度 路由策略类似于Nginx哦 XXL-Job实际封装的是Quartz. 关于分片广播,执行器集群部署时候,任务路由策略选择“”分片广播”情况下,一 ...
- Spark及其生态系统简介总结
Spark拥有DAG执行引擎,支持在内存中对数据进行迭代计算 Spark不仅支持Scala编写应用程序,而且支持Java和Python等语言进行编写,特别是Scala是一种高效.可拓展的语言,能够用简 ...
- NCBI
RefSeq: NCBI Reference Sequences GeneBank序列注释说明 利用NCBI查找基因信息 NCBI中RefSeq各种accession说明(一) NCBI中RefSeq ...
- HBase-建表(普通建表及预分区建表)
package com.hbase.HBaseAdmin; import java.io.IOException; import org.apache.hadoop.conf.Configuratio ...
- 1.java实现——正规表达式判断
目标:这个代码仅局限于所展示的正规表达式判断,也就是这是一个较单一的正规表达式判断(简易版). 既然是简易版的,所以若要修改这个正规表达式也是非常容易的,只要将二维数组中的数组修改即可.数组数据依据, ...
- Difference between stem and lemma
lemma与stem的区别 Difference between stem and lemma 先从wikipedia上看看什么是stem,什么是lemma? Lemma(morphology):In ...
- JavaScript -- 正则表达式 检验表单提交的内容
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- 基于组的策略(GBP)开启新型网络设计时代
在传统物理网络环境下,划分VLAN,分配网段,设置路由是个网工应该熟悉的内容.在SDN环境下,比如neutron虚拟网络,我们用API创建网络,子网,虚拟路由器,负载均衡和防火墙,这些还是太网络化了. ...
- compile to 32-bit elf file
nasm -f elf -o a.o a.asm gcc -c -m32 -o b.o b.c ld -s -m elf_i386 -Ttext 0x30400 -o b.bin b.o a.o