符号常量 #define Pi 3.1415926f;常值变量 const float pi 3.1415926f;

第一种方式:宏定义,是将Pi定义成一种符号,此时Pi只是3.1415926的别名,在编译期间用3.1415926去取代Pi的值。

1.define是宏定义,程序在预处理阶段将用define定义的内容进行了替换。因此程序运行时,常量表中并没有用define定义的常量,系统不为它分配内存。const定义的常量,在程序运行时在常量表中,系统为它分配内存。

2.define定义的常量,预处理时只是直接进行了替换。所以编译时不能进行数据类型检验。const定义的常量,在编译时进行严格的类型检验,可以避免出错。

3.define定义表达式时要注意“边缘效应”,例如如下定义: #define N 2+4 //我们预想的N值是6,我们这样使用N,int a = N/2; //我们预想的a的值是3,可实际上a的值是4原因在于在预处理阶段,编译器将 a = N/2处理成了 a = 2+4/2;这就是宏定义的字符串替换的“边缘效应”因此要如下定义:#define N (2+4)。

PS: 这里经评论区提醒有错,数值有所改动

第二种方式:是将PI定义成变量,但告诉编译器它的值是固定不变的,如果在程序中试图去修改它的值,在编译时会报错。

const定义的常量叫做常变量原因有二:const定义常量像变量一样检查类型;const可以在任何地方定义常量,编译器对它的处理过程与变量相似,只是分配内存的地方不同。

总结起来说,推荐用const ,而不是#define 预处理指令(但是目前看到的是使用#define的较多,难道是方便?有待考量)

1. const 可以定义数据类型,提高了类型安全性。例如,我们上面可以指定PI 这个常量是double 类型

2. const 既然是变量(这里有点别扭,它其实是不变的,但名称叫做常值变量), 那么就有地址,适用面更加广

3. 语法上也更好理解一些

如果有提出问题的或者明确了解的请留言,谢谢!

参考:https://wenku.baidu.com/view/c0244d44777f5acfa1c7aa00b52acfc789eb9f6c.html

常量的两种定义方式比较相关推荐

  1. C语言字符串的两种定义方式

    C语言中 初始化一个字符串有两种定义方式: 第一种为 char str[] = "hello"; 或者 char str[] = {'h','e','l','l','o','\0' ...

  2. Spring AOP拦截规则的两种定义方式

    Spring AOP拦截规则的两种定义方式 AOP的根本目的就是解耦,分开业务代码与系统共用代码,例如打印日志. Spring支持AspectJ的注解式切面编程,主要包含4个部分,分别是 使用@Asp ...

  3. C语言中字符串的两种定义方式

    我们知道C语言中是没有字符串这种数据类型的,我们只能依靠数组进行存储,即字符数组,而我们定义并且初始化数组有两种方式.下面将给大家介绍这两种方式并且介绍这两种方式的区别: 方式1 前两种是正确的定义方 ...

  4. 【C++ 语言】面向对象 ( 函数重载 | 运算符重载 | 运算符重载两种定义方式 | 拷贝构造方法 | RVO 优化 | NRVO 优化 )

    文章目录 函数重载 运算符重载 ( 类内部定义云算符重载 ) 运算符重载 ( 类外部定义运算符重载 ) 可重载的运算符 拷贝构造方法 编译器优化 ( RVO 优化 | NRVO 优化 ) 完整代码示例 ...

  5. Google Earth Engine (GEE)——利用两种方式进行EVI指数(含函数的两种定义方式)

    如何快速使用波段进行指数的计算,我们这里利用两种方式进行EVI指数计算,一种是利用expression的方式进行分析,虽然两种方法的结算结果都一样,但是代码有多有少,大家可以参考使用,但是两者的作用对 ...

  6. C语言动态数组的两种定义方式

      动态内存分配具有非常多的好处,可以最大化的节约内存空间的大小.本文将通过两种方式来实现C语言中内存的动态分配,希望你看完本文后能有所收获. 一.直接对数组大小进行输入 在C99标准中C语言数组已支 ...

  7. PCL学习(4.5)——点云对象的两种定义方式的区别与转换

    创建与访问 第一种,是一种vector的赋值方式,将point数据push_back到pcl::PointXYZ类型的模板中. pcl::PointCloud<pcl::PointXYZ> ...

  8. TF之RNN:TF的RNN中的常用的两种定义scope的方式get_variable和Variable

    TF之RNN:TF的RNN中的常用的两种定义scope的方式get_variable和Variable 目录 输出结果 代码设计 输出结果 代码设计 # tensorflow中的两种定义scope(命 ...

  9. Java中定义字符串的两种常见方式、使用==和equals()比较字符串

    在讲使用==和equals()比较字符串之前,我们首先要讲定义字符串的两种常见方式,一种是定义一个常量,即直接定义字符串,一种是通过new关键字定义一个变量,即使用String类定义字符串,如下图: ...

最新文章

  1. 【原】移动端界面的适配
  2. 【分享】博客美化(6)为你的博文自动添加目录【转】
  3. FreeRTOS 任务优先级分配方案
  4. Cortex-M3中的寄存器组
  5. XCTF WEB view_source
  6. Java——去除字符串中的中文
  7. 关于c语言编写 单项链表 的创建、插入、修改、删除、显示、退出 的程序案例
  8. Codeforces 699D Fix a Tree 并查集
  9. position的用法小结
  10. 类的加载过程详解之过程三:Initialization(初始化)阶段
  11. 怎么快速在计算机植入病毒,怎样给别人的电脑植入病毒
  12. IIC协议详解,附单片机软件模拟源码
  13. 手机显示DNS服务器异常,DNS服务器异常?
  14. href和src的区别
  15. SAP学习之北冥神功
  16. BISTML-CRF项目源码
  17. Artifact xxx:war exploded: Error during artifact deployment
  18. IT人面试秘籍:面试官背后的小心思都在这儿
  19. 九齐单片机NY8B062E的ADC零点校准程序记录
  20. 树莓派c语言人脸识别,树莓派实现简单的人脸识别

热门文章

  1. 数据库 删除数据的三种方式
  2. java 登录过滤_Java 过滤器实现(登录) + 拦截器(两种方法)
  3. android setadapter 闪退,Android问题小结之BindingAdapter的自定义方法
  4. 电脑硬盘数据恢复( 4个简单方法!)
  5. 浅析Anycast技术
  6. 【Linux】Linux编译器gcc/g++的使用
  7. Android实现轮询
  8. torch.linspace
  9. Java11新特性一览
  10. 天天写日记争当文艺青年 2014-5-28