一、类型和安全检查不同

宏定义是字符替换,没有数据类型的区别,同时这种替换没有类型安全检查,可能产生边际效应等错误;

const常量是常量的声明,有类型区别,需要在编译阶段进行类型检查

二、编译器处理不同

宏定义是一个"编译时"概念,在预处理阶段展开,不能对宏定义进行调试,生命周期结束与编译时期;

const常量是一个"运行时"概念,在程序运行使用,类似于一个只读行数据

三、存储方式不同

宏定义是直接替换,不会分配内存,存储与程序的代码段中;

const常量需要进行内存分配,存储与程序的数据段中

四、定义域不同

void f1 ()
    #define N 12
    const int n 12;
void f2 ()
    cout<<N <<endl; //正确,N已经定义过,不受定义域限制
    cout<<n <<endl; //错误,n定义域只在f1函数中

五、定义后能否取消

宏定义可以通过#undef来使之前的宏定义失效

const常量定义后将在定义域内永久有效

void f1()
    #define N 12
    const int n = 12;
    #undef N //取消宏定义后,即使在f1函数中,N也无效了
    #define N 21//取消后可以重新定义

六、是否可以做函数参数

宏定义不能作为参数传递给函数

const常量可以在函数的参数列表中出现

const常量与define宏定义的区别

(1) 编译器处理方式不同

  define宏是在预处理阶段展开。

  const常量是编译运行阶段使用。

(2) 类型和安全检查不同

  define宏没有类型,不做任何类型检查,仅仅是展开。

  const常量有具体的类型,在编译阶段会执行类型检查。

(3) 存储方式不同

  define宏仅仅是展开,有多少地方使用,就展开多少次,不会分配内存。(宏定义不分配内存,变量定义分配内存。)

  const常量会在内存中分配(可以是堆中也可以是栈中)。


(4)const  可以节省空间,避免不必要的内存分配。 例如: 
        #define PI 3.14159 //常量宏 
        const doulbe Pi=3.14159; //此时并未将Pi放入ROM中 ...... 
        double i=Pi; //此时为Pi分配内存,以后不再分配! 
        double I=PI; //编译期间进行宏替换,分配内存 
        double j=Pi; //没有内存分配 
        double J=PI; //再进行宏替换,又一次分配内存! 
        const定义常量从汇编的角度来看,只是给出了对应的内存地址,而不是象#define一样给出的是立即数,所以,const定义的常量在程序运行过程中只有一份拷贝(因为是全局的只读变量,存在静态区),而 #define定义的常量在内存中有若干个拷贝。 
(5) 提高了效率。 编译器通常不为普通const常量分配存储空间,而是将它们保存在符号表中,这使得它成为一个编译期间的常量,没有了存储与读内存的操作,使得它的效率也很高。

(6) 宏替换只作替换,不做计算,不做表达式求解;

       宏预编译时就替换了,程序运行时,并不分配内存。
 

  const常量有具体的类型,在编译阶段会执行类型检查。   (3) 存储方式不同   define宏仅仅是展开,有多少地方使用,展开多少次,不会分配内存。(宏定义不分配内存,变量定义分配内存。)   const常量会在内存中分配(可以是堆中也可以是栈中)。   (4)const  可以节省空间,避免不必要的内存分配。 例如: #define PI 3.14159 //常量
const定义的是变量不是常量,只是这个变量的值不允许改变是常变量!带有类型。编译运行的时候起作用存在类型检查。 define定义的是不带类型的常数,只进行简单的字符替换。在预编译的时候起作用,不存在类型检查。 (1) 编译器处理方式不同 #define 宏是在预处理阶段展开。 const 常量是编译运行阶段使用。 (2) 类型和安全检查不同 #define 宏没有类型,不做任何类型检查,仅仅是展开。 const 常量有具体的类型,在编译阶段会执行类型检查。 (3) 存储方...
https://www.jb51.net/article/139225.htm https://blog.csdn.net/weibo1230123/article/details/81981384 用#define MAX 255定义的常量是没有类型的,所给出的是一个立即数,编译器只是把所定义的常量值与所定义的常量的名字联系起来,define所定义的宏变量在预处理的时候进行替换,在程序中使用...
1、编译处理阶段不同:define是在预处理阶段进行宏展开,const是在编译运行阶段。 2、类型和安全检查不同:const常量有具体的类型,在编译阶段会执行类型检查,而define没有。 3、存储方式不同:const常量会进行内存分配(C++中,对于简单类型的临时常量会保存在符号表里面进行替换,而不会分配内存),而define仅仅是展开,不会分配内存。 4、有些调试工具可以对const进行调试,...
一、constdefine区别 (1)就起作用的阶段而言:#define是在编译的预处理阶段起作用(在预处理阶段进行替换),而const是在编译运行的时候起作用(const修饰的只读变量是在编译的时候确定其值) (2)就起作用的方式而言:#define只是简单的字符串替换,没有类型检查。而const有对应的类型,是要进行判断的,可以避免一些低级的错误 (3)就存储方式而言:#define...
这个区别用从几个角度来说: 角度1: 就定义常量说的话: const 定义的常数是变量 也带类型, #define 定义的只是个常数 不带类型。 角度2: 就起作用的阶段而言: define是在编译的预处理阶段起作用,而const是在 编译、运行的时候起作用。 角度3: 就起作用的方式而言: define只是简单的字符串替换,没有类型检查。而const有对应的数据类型,是要进行判断的,可以避免一些低级的错误。 正因为define只是简单的字符串替换会导致边界效应,具体举例可以参考下面代码: #define
浅述:const用于类成员变量的定义,同时const本身就是一个语言结构,而 define是一个函数,const在编译的时候要比define快很多区别: 1. const用于类成员变量的定义,只要一定义,不可修改。define 不可用于类成员变量的定义,但是可以用于全局变量。 2. const不能在条件语法中定义,而define可以,比如在if…else..中 3. const采用一
1、编译处理阶段不同:define是在预处理阶段进行宏展开,const是在编译运行阶段。 2、类型和安全检查不同:const常量有具体的类型,在编译阶段会执行类型检查,而define没有。 3、存储方式不同:const常量会进行内存分配(C++中,对于简单类型的临时常量会保存在符号表里面进行替换,而不会分配内存),而define仅仅是展开,不会分配内存。 4、有些调试工具可以对const进行调试,...
1. const常量是在编译时分配内存,而#define是在预处理时进行文本替换,不会分配内存。 2. const常量有类型,可以进行类型检查,而#define没有类型,只是简单的文本替换。 3. const常量可以进行地址取值操作,而#define不可以。 4. const常量可以在多个文件中共享,而#define只能在定义它的文件中使用。 5. const常量可以进行调试,而#define不可以。 因此,建议在定义常量时优先使用const,而不是#define。 ### 回答2: const常量C++中常用的一种数据类型。定义了const常量之后,它的值不能改变,因此const常量也被称为“只读变量”。 定义const常量的语法格式如下: const 数据类型 常量名 = 常量值; 其中,const表示定义一个常量,数据类型指定了常量的类型,常量名指定了常量的名字,常量值则指定了常量的值。 与const常量类似的是#define宏定义,它们的区别在于前者是编译器处理的常量,后者是预处理器处理的常量宏定义不会对常量进行类型检查,容易出现错误,在C++中往往使用const常量来代替宏定义const常量非常有用,它可以保证程序在运行过程中某些数值不被无意中修改。另外,const常量也可以作为参数传递给函数,这样可以避免函数中修改传入参数的值,增强程序的可读性和健壮性。在类中,const常量也可以用来声明成员变量,表示它的值在对象生命周期内不会改变。 总之,const常量C++中非常重要的一种数据类型,它可以保证程序的安全性和稳定性,非常适合用于需要保证某些值不被随意修改的场合。 ### 回答3: let变量在JavaScript中的区别是什么? 在JavaScript中,const常量和let变量是两种常用的声明变量的方式。它们与var的不同之处在于它们在声明后具有不同的作用域和可变性。具体区别如下: 1. const常量:声明一个常量时,必须立即初始化常量的值,不能再次赋值。而且,const声明的常量是块级作用域,在声明的块级别内可见。此外,如果尝试重新分配const常量,将会引发TypeError错误。 2. let变量:初始化后,let声明的变量可以更改其值。与const一样,let变量也是在块级别的作用域中声明的,但是它在作用域中声明的变量可以被更改赋值。 总的来说,const常量和let变量在声明后都可以使用块级作用域,这意味着它们在声明块级别内可见,而不是在函数级别内。但是,const常量以初始化值之后不能进行赋值,同时,let变量可以被重新赋值。选择const还是let变量,需要根据实际需求和定义变量的用途来判断。 先移项:xxxx xxxx = 0000 0000-0000 1110。 可得出:xxxx xxxx = (借位 1) 1111 0010。 取八位:xxxx xxxx = 1111 0010。 因此,[-14]补码 = 1111 0010。 负数的补码,就是这么推出来的。 补码,和 “符号位原码反码取反加一”, 一丁点的关系,都没有! GNU汇编程序中的分段(.section伪操作) 平常心006: 感谢分享,请问这个信息的来源文档是哪个网页或者文档?谢谢