初识C++之剖析const与#define

1、 编译器处理方式不同
  #define是一个宏定义命令,它是在预处理阶段就进行了替换;
  const修饰的是一个编译时常量,它是在编译阶段处理的。
2、 类型和安全检查不同
  #define定义的标识符仅仅是产生文本替换,不管内容是否正确;
  const修饰的符号是一个具有类型的符号,编译器在编译时会对其做严格的检查。
3、书写方式不同
  #define是一个预处理命令,结束时没有分号;
  const定义常量是一个说明语句,以分号结束。
  这里写图片描述
4、 存储方式不同
  #define宏仅仅是展开,有多少地方使用,就展开多少次,不会分配内存。
  const常量会在内存中分配(可以是堆中也可以是栈中)。
5、const 可以节省空间,避免不必要的内存分配。
例如:
  #define PI 3.14159 //常量宏
  const doulbe Pi=3.14159; //此时并未将Pi放入内存中 ……
  double i=Pi; //此时为Pi分配内存,以后不再分配!
  double I=PI; //编译期间进行宏替换,分配内存
  double j=Pi; //没有内存分配
  double J=PI; //再进行宏替换,又一次分配内存!
  
  const定义常量从汇编的角度来看,只是给出了对应的内存地址,而不是象#define一样给出的是立即数,所以,const定义的常量在程序运行过程中只有一份拷贝,而 #define定义的常量在内存中有若干个拷贝。
6、作用域
  #define定义的常量,尽管在某个函数内,但他的作用域是从定义开始,直到遇到#undef取消其定义为止,要是不取消,就会直到文件结束;
  const定义的变量,要是在函数内,那么它的作用域就是它定义开始,到它所在的复合语句结束为止。
7、提高了效率。
  编译器通常不为普通const常量分配存储空间,而是将它们保存在符号表中,这使得它成为一个编译期间的常量,没有了存储与读内存的操作,使得它的效率也很高。
8、 调试
  有些集成化的调试工具可以对const常量进行调试,但是不能对#define修饰的宏常量进行调试。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/526175.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

初识C++之运算符重载

C里面有一个叫作运算符重载的特性,它其实是基于函数实现的,下面就来介绍一下运算符重载。 1、What  C中预定义的运算符的操作对象只能是基本数据类型。但实际上,对于许多用户自定义类型(例如类),也需要类…

对堆栈的认识

什么是堆和栈,它们在哪儿? 问题描述 编程语言书籍中经常解释值类型被创建在栈上,引用类型被创建在堆上,但是并没有本质上解释这堆和栈是什么。我仅有高级语言编程经验,没有看过对此更清晰的解释。我的意思是我理解什…

Waiting For Debugger

最近楼主在使用手机上的邮政银行时,总是打不开,要强制关闭,给我一个“Waiting For Debugger”的提示,相信朋友们应该遇到过类似的问题,当然这里不一定就是邮政银行出问题,可能是你手机里的任意一款软件&…

防止头文件重复包含之pragma once与#ifndef

在我们自己编写 C/C的头文件时,可能会忽略一点:用一些处理机制来避免头文件的重复包含,因为头文件的内容在预编译时是把头文件的内容完全拷贝到引入的地方替换头文件的包含命令,而包含的头文件可能有包含很多内容,所以…

初识C++之继承

1、何为继承 C中所谓继承,就是在一个已存在类的基础上创建一个新的类,新类获得已存在类的部分特性(为什么是部分特性,后面会讲到)。已存在类被称为基类(Base Class)或父类(Father Cl…

初识C++之函数重载、重写、重定义的区别

在C的学习中,慢慢接触了一些很容易混淆的名词,今天就来剖析几个容易混淆的名词。 1、函数重载   重载函数是函数的一种特殊情况,为方便使用,C允许在同一范围中声明几个功能类似的同名函数,但是这些同名函数的形式参…

初识C++之封装

学习C不得不说到C的三大特性:封装、继承、多态,今天就先来剖析一下他的封装性。 1、什么是封装   封装就是将抽象得到的数据和行为(或功能)相结合,形成一个有机的整体,也就是将数据与操作数据的源代码进…

初识C++之虚函数

1、什么是虚函数   在基类中用virtual关键字修饰,并在一个或多个派生类中被重新定义的成员函数,用法格式为:   virtual 函数返回类型 函数名(参数表)    {     函数体    }    虚函数是实现多态性…

初识C++之多态

多态性是将接口与实现进行分离;用形象的语言来解释就是实现以共同的方法,但因个体差异,而采用不同的策略。 1、什么是多态   多态(Polymorphism)按字面的意思就是“多种状态”。在面向对象语言中,接口的…

从尾到头打印单链表(C语言)

void PrintListTailToHead(PSListNode pHead) {if (NULL ! pHead){//递归实现PrintListTailToHead(pHead->pNextNode);printf("%d ", pHead->data);} } 递归方式很容易就能实现。

删除一个无头单链表的非尾节点(C语言)

void DelNotTailNode(PSListNode pos) {PSListNode pNode NULL;assert(pos);if (NULL pos->pNextNode){return;}else{DataType temp 0;//交换pos和pos->pNextNode的数据(相当于交换了两个结点的位置),使问题转换为删除pos指向的结点…

在无头单链表的一个非头节点前插入一个节点(C语言)

①时间复杂度为N: void InsertNotHead(PSListNode pHead, PSListNode pos, DataType data) {PSListNode pPreNode pHead;PSListNode pPreNode pHead;if (NULL pos){return;}else{//先找到pos结点前面的结点while(pCurNode ! pos){pPreNode pCurNode;pCurNode …

单链表实现约瑟夫环(JosephCircle)(C语言)

//使链表形成一个环 void FormCyc(PSListNode *pHead) {if (NULL pHead){return;}else{PSListNode pNode *pHead;while (NULL ! (pNode->pNextNode)){pNode pNode->pNextNode;}pNode->pNextNode *pHead;} }PSListNode JosephCircle(PSListNode pHead, int M) {if …

逆置/反转单链表(C语言)

1、逆置链表:前插法 void ReverseList(PSListNode* pHead) {if (NULL *pHead){return;}else{//创建一个新的空链表,遍历pHead指向的链表里的所有节点,每找到一个,就前插到新链表里PSListNode pNewHead *pHead;*pHead (*pHead)…

单链表排序(冒泡排序)(C语言)

优化版: void SortList(PSListNode pHead) {if (NULL pHead){return;}else{int flag 0;PSListNode pTailNode NULL;//当设置的尾节点与头结点指向同一个节点时,说明只有一个元素为排序,那么冒泡完成while (pTailNode ! pHead){PSListNode…

合并两个有序链表,合并后依然有序(C语言)

PSListNode MergeList(PSListNode pL1, PSListNode pL2) {PSListNode pNewNode NULL;PSListNode pListNode1 pL1;PSListNode pListNode2 pL2;PSListNode pNode NULL;if (NULL pListNode1){return pListNode2;}else if (NULL pListNode2){return pListNode1;}else{//先把新…

查找单链表的中间节点,要求只能遍历一次链表(C语言)

PSListNode FindMidNode(PSListNode pHead) {if (NULL pHead){return NULL;}else{//快慢指针,快指针一次循环走两步,慢指针一次循环走一步PSListNode pSlow pHead;PSListNode pFast pHead;//注意结束条件得加上NULL ! pFast->pNextNode&#xff0c…

查找单链表的倒数第k个节点,要求只能遍历一次链表(C语言)

PSListNode FindLastKNode(PSListNode pHead, int K) {if ((NULL pHead) || (K < 0)){return NULL;}else{PSListNode pFast pHead;PSListNode pSlow pHead;//利用快慢指针&#xff0c;让快指针先走K-1步&#xff0c;然后两指针同时走&#xff0c;直到快指针指向的下一个结…

判断单链表是否带环?若带环,求环的长度?求环的入口点?(C语言)

PSListNode HasCycle(PSListNode pHead) {if ((NULL pHead) || (NULL pHead->pNextNode)){return NULL;}else{PSListNode pFast pHead->pNextNode->pNextNode;PSListNode pSlow pHead->pNextNode;//利用快慢指针&#xff0c;让快指针每次走两步&#xff0c;慢指…

判断两个链表是否相交,若相交,求交点。(假设链表可能带环)【升级版】(C语言)

int IsListCroseWithCycle(PSListNode pL1, PSListNode pL2) {PSListNode pMeetNode1 HasCycle(pL1);PSListNode pMeetNode2 HasCycle(pL2);if ((NULL pL1) || (NULL pL2)){return 0;}//两个链表都没环的情况else if ((NULL pMeetNode1) && (NULLpMeetNode2)){PSL…