初识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”的提示,相信朋友们应该遇到过类似的问题,当然这里不一定就是邮政银行出问题,可能是你手机里的任意一款软件&…

初识C++之继承

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

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

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

初识C++之封装

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

初识C++之虚函数

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

初识C++之多态

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

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

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

浅析Linux开发工具之gcc/g++

在windows开发平台,我们用惯了vc、vs等IDE(集成开发环境),在编译好源代码之后,按下相应按钮,IDE就会为我们完成编译,链接的过程。然而在Linux平台下,却没有这么方便的开发环境&#…

Linux权限的简单剖析

一、权限是什么 权限(privilege)是指某个特定的用户具有特定的系统资源使用权力。举个简单的例子,夏日炎炎,你看到路边有卖西瓜的,你想要吃西瓜,你就得买它,买它其实就是获取你对西瓜的使用权限…

Linux文件的三种时间属性

一、Linux文件时间属性的分类 我们在用windows系统时,在查看磁盘文件时,经常会看到文件或目录的后面有一个时间信息,这个是文件在磁盘上别创建的时间。其实,在windows系统中,文件还有文件的修改时间、访问时间两个时间…

浅析Linux开发工具之Makefile

一、什么是Makefile 在windows平台下,有很多的IDE供我们使用,我们不会去考虑怎么把一个很大的工程编译链接为一个可执行程序,因为这些事IDE都为我们做了,而在Linux平台下,我们并没有这么高端的IDE供我们使用&#xff…

嵌入式面试准备

题目都摘于网上 嵌入式系统中经常要用到无限循环,如何用C编写死循环 while(1){}或者for(;😉 内存分区 代码区,全局区(全局变量,静态变量,以及常量),栈区,堆区 const关键…

C语言extern与static修饰变量

extern和static在C语言里面的作用这里就不做过多的阐述了&#xff0c;下面直接通过一个小程序来看一看他们修饰的变量的特性。 #include <stdio.h>int count 3;int main() {int i 0, count 2, sum 0;for (i 0; i < count; i 2, count){static int count 4;cou…

函数值的交换

《函数值的交换》 交换函数的几种方式&#xff1a; (1) //error int Swap1(int a,int b) { int tmp; tmp a; a b; b tmp; return 0; } 在函数Swap1中&#xff0c;a和b的地址的值并没有交换。只是把10和20赋给了a和b&#xff0c;a和b原本的值并没有改变。 (2) #…

数组的下标越界

《数组下标越界》 数组定义的一般形式为&#xff1a;类型说明符 数组名[常量表达式] [常量表达式]这两个常量表达式分别指定了二维数组的行数和列数&#xff0c;程序编译时据此向内存申请空间。 引用二维数组的格式为&#xff1a;数组名[行下标] [列下标]&#xff0c;下标都是从…

指针的加减法计算

(1) 指针&#xff1a;&#xff08;p&#xff09;表示加一个单元格&#xff08;单元格的字节随类型而定&#xff09;#include<stdio.h>int main(){int arr[10]{1,2,3,4,5,6};int *p arr;p;printf("%d %d\n",arr[0],arr[1]);return 0;}(2) 指针加数字&#xff1…

字符串在指针和数组上赋值的区别

1 #include<stdio.h> 2 int main() 3 { 4 char *str1 "abcde";// 字符串常量 5 char str2[] "abcde";// 字符数组 6 str1[0] x;//error 7 str2[0] x; 8 return 0; 9 } 注&#xff1a;代码运行到第6行崩溃 *str1是一个指…

继承与多态(一)

目录 一、继承的概念&#xff1a; 二、公有继承 三、私有继承 四、保护继承 五、保护继承与保护成员的访问 一、继承的概念&#xff1a; 在C中可以用已有的类来定义新的类&#xff0c;新类将继承原有类的全部特性&#xff0c;原有类称为基类&#xff08;父类&#xff09;&…