当前位置: 首页 > article >正文

C/C++中的#define和const的特点与区别

 

在C和C++中,#defineconst都可以用来定义常量,但它们在使用方式和语义上有很大的不同。下面将详细对比它们的特点和使用场景。

#define

  • 定义方式

    #define是预处理器指令,用于定义宏。它在编译前被处理,将代码中的所有出现的宏名替换为宏定义的值。
  • 示例

    #define PI 3.14159

    在代码中,所有出现的PI都会被替换为3.14159

  • 特点

    • 简单:使用#define定义常量非常简单,不需要类型声明

    • 预处理器处理#define定义的常量在预处理阶段被替换,不会占用运行时内存

    • 无类型#define定义的常量没有类型,只是一个简单的文本替换

    • 全局作用域#define定义的宏在定义后的作用域内有效,通常在整个文件中有效。

    • 宏展开#define可以定义复杂的宏,如带参数的宏

const

  • 定义方式const是C++中的关键字,用于定义常量。它在编译时被处理,定义的常量有具体的类型。

  • 示例

    const double PI = 3.14159;

    在代码中,PI是一个double类型的常量,值为3.14159

  • 特点

    • 类型安全const定义的常量有具体的类型编译器会进行类型检查

    • 运行时存在const定义的常量在运行时存在,占用内存。

    • 可调试const定义的常量可以在调试器中查看和使用。

    • 局部作用域const定义的常量可以有局部作用域,例如在函数内部定义的const变量只在该函数内有效。

    • 不可修改const定义的变量在初始化后不能被修改。

比较

特点#defineconst
定义方式预处理器指令,文本替换编译时定义,有类型
类型安全无类型,仅文本替换有类型,编译器进行类型检查
调试支持不支持调试支持调试
使用场景简单的常量定义,宏定义需要类型安全的常量定义
作用域全局作用域可以有局部作用域
可修改性无,但无类型检查不可修改,有类型检查
内存占用不占用运行时内存占用运行时内存
存储方式预处理阶段替换为文本编译时分配内存,存储值

推荐使用

  • #define

    • 适用于简单的常量定义,尤其是宏定义,如#define MAX(a, b) ((a) > (b) ? (a) : (b))

    • 适用于需要全局作用域的常量定义。

    • 适用于需要在预处理阶段进行文本替换的场景。

  • const

    • 适用于需要类型安全的常量定义。

    • 适用于在函数参数和返回值中使用常量。

    • 适用于需要局部作用域的常量定义。

    • 适用于需要在调试器中查看和使用的常量。

示例代码

#include<stdio.h>
#include<iomanip>
#define PI 3.14159 // 使用#define定义圆周率
const double RATE = 6.5573; // 使用const定义汇率

int main() {
    double r, C, S;
    scanf("%lf", &r);
    C = 2 * PI * r; // 使用#define定义的常量
    S = PI * r * r;
    printf("%.2f %.2f\n", C, S);

    double dollar, RMB;
    scanf("%lf", &dollar);
    RMB = dollar * RATE; // 使用const定义的常量
    printf("%.2f\n", RMB);

    return 0;
}

在这个示例中,PI使用#define定义,RATE使用const定义,展示了两种定义方式的不同用途。

 

收藏加关注,观看不迷路 


http://www.kler.cn/a/523722.html

相关文章:

  • 【Jave全栈】Java与JavaScript比较
  • 区块链的数学基础:核心原理与应用解析
  • 数据分析系列--①RapidMiner软件安装
  • 如何解决跨浏览器兼容性问题
  • 通过高效的侦察发现关键漏洞接管整个IT基础设施
  • SOME/IP--协议英文原文讲解2
  • Baklib如何重塑内容中台的智能化推荐系统实现个性化服务
  • 《Java核心技术 卷II》日期和时间API的时间线
  • 马尔科夫模型和隐马尔科夫模型区别
  • PostGIS笔记:PostgreSQL中表、键和索引的基础操作
  • 蛇年 | 巳巳如意,生生不息
  • 2025金蛇迎春,和数集团祝您新年快乐,蛇年大吉
  • 【机器学习】自定义数据集 使用pytorch框架实现逻辑回归并保存模型,然后保存模型后再加载模型进行预测
  • Java中ExecutorService接口介绍、应用场景和示例代码
  • 如何运用python爬虫爬取百度贴吧的静态图片?
  • 懂球短视频微信小程序SpringBoot+论文源码调试讲解
  • 06-AD向导自动创建P封装(以STM32-LQFP48格式为例)
  • Linux 基础1
  • 【C++题解】1393. 与7无关的数?
  • centos7搭建flink1.18并以 standalone模式启动
  • 前端UI组件库的打包与发布
  • 网站服务器出现延迟的原因是什么?
  • 使用 lock4j-redis-template-spring-boot-starter 实现 Redis 分布式锁
  • EtherCAT主站IGH-- 54 -- IGH之控制电机旋转周期同步位置模式(CSP模式)
  • Java阶段四06
  • 【452. 用最少数量的箭引爆气球 中等】