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

常量的概念以及用法

1. 字面常量 (Literal Constants)


直接在代码中写出的具体数值或字符,没有名字。
整型常量:10, -5, 0xFF (十六进制), 012 (八进制)
浮点常量:3.14, 1.2e-5
字符常量:'A', 'n', '\n' (转义字符)
字符串常量:"Hello World"

2.使用 #define 宏定义 (预处理常量)

这是 C 语言中最传统的定义常量的方法。它在预处理阶段进行简单的文本替换,不分配内存,没有类型检查

3.使用 const 关键字 (常变量)

语法:const 数据类型 常量名 = 值;
特点:
必须以分号;结尾。
有类型安全(Type Safety)。
可以进行调试(因为它是符号表的一部分)。
可以限定指针指向的内容不可变。

const 与指针的结合(难点)

const 放在 * 的不同位置,含义不同

const int *p 或 int const *p: 含义:指针指向的内容是常量,不能通过指针修改值,但指针本身可以指向别处。 口诀:“const 在 * 左边,内容不可改”。

int * const p: 含义:指针本身是常量,不能改变指针的指向,但可以通过指针修改它指向的值。 口诀:“const 在 * 右边,指针不可改”。

const int * const p: 含义:两者都不可改

声明读法修改*p(值)修改p(地址)记忆技巧
int *p普通指针随便改
const int *p常量指针左边管值
int * const p指针常量右边管指向
const int * const p指向常量的常量指针锁死

4.枚举(enum)

如果需要定义一组相关的整数常量,使用 enum 更清晰

#include<stdio.h> int main() { enum Color{ red = 1, green = 6, blue }; printf("red=%d\n",red); printf("green=%d\n",green); printf("blue=%d\n",blue); return 0; }

5.#define 与 const 的区别总结

特性#define(宏)const(关键字)
处理阶段预处理阶段(编译前)编译阶段
类型检查无(纯文本替换,易出错)有(类型安全)
内存占用不分配内存(直接替换代码)通常分配内存(存储在数据段)
调试支持不支持(调试器看不到宏名)支持(调试器可以看到变量名)
地址操作不能取地址 (&)可以取地址 (&)
推荐程度旧式写法,用于复杂的宏逻辑现代 C 语言推荐写法

预处理器宏与变量的区别
#define 是一个预处理器指令,用于在编译前将某些文本替换为指定的值。它没有类型信息,是简单的文本替换。#define 声明的常量不会占用内存,它只是在预处理阶段做替换。
const 是C语言中的一个类型修饰符,用来声明常量,它会为常量分配内存并指定类型。常量的值在程序运行期间不可修改。
类型安全
#define 没有类型信息,编译器无法检查类型。因此,它在某些情况下可能导致类型不匹配的问题。
const 声明的常量具有类型,可以利用编译器的类型检查来避免错误。
作用域
#define 声明的常量是全局的,通常在整个文件中有效,甚至跨函数调用,除非使用#undef来取消定义。
const 声明的常量遵循变量的作用域规则,可以限制常量的作用范围。
#define 更适用于简单的常量替换、条件编译和宏函数,它不具备类型检查,灵活性高,但容易引发错误。
const 更适用于需要类型安全、具有作用域限制的常量声明,特别是在涉及到变量和复杂数据类型时。

http://www.cnnetsun.cn/news/1376899.html

相关文章:

  • 如何用图形界面轻松管理macOS应用:Applite完全指南
  • GitHub中文插件终极指南:5分钟打造你的专属中文开发环境
  • nodejs+vue基于springboot的大学生创新创业项目管理
  • KLayout新手必看:5分钟搞定圆形、文字和复杂图案绘制(附实例截图)
  • 目标检测避坑指南:双阶段算法中的RoI Pooling与RoI Align详解
  • 实战案例:用Qwen3-ForcedAligner-0.6B为AI合成语音制作精准动态字幕
  • GLM-4-9B-Chat-1M行业解决方案:医疗文献综述自动生成平台
  • 【3DGS】Win11系统下3D Gaussian Splatting从零配置到实战渲染
  • Stable Fast 3D技术实战指南 - 从图片到3D模型的0.5秒魔法
  • HG-ha/MTools快速部署:基于预编译镜像的10分钟开箱即用全流程
  • Beyond Compare 5完全激活终极指南:告别30天试用期的3种简单方法
  • CW32F030驱动ILI9488彩屏与XPT2046触摸的软件SPI移植
  • 从零开始:如何用Python快速处理纹理识别数据集(FMD/DTD实战)
  • 【限时技术内参】:MCP 1.2+ VS Code 1.89+ 插件集成避坑清单(含官方未文档化的4个API行为变更)
  • 倍福Hot Connect实战解析:从原理到灵活拓扑部署
  • IBIS模型完全指南:从SPICE转换到模型验证的完整工作流(V5.0版)
  • 避坑指南:Mediapipe手势识别与Unity通信中的常见问题及解决方案
  • Python OPCUA实战:从零配置西门子PLC加密通讯(附证书生成避坑指南)
  • PX4无人机仿真实战:Cartographer SLAM建图与ROS环境深度集成
  • 告别软件管家!IT运维用Winget实现企业级批量部署的3个高阶技巧(含排错指南)
  • IBM完成对Confluent企业价值110亿美元的收购
  • SHT20温湿度传感器嵌入式驱动开发与I²C通信详解
  • NTC温度采样电路优化:分压电阻选择与功率平衡
  • 免Root修改手机DPI的3种方法实测:ADB命令 vs 第三方工具 vs 系统设置
  • 解决在python中用polars库访问vertex格式文件遇到的离奇错误
  • 在 Windows 中解决 `zig fetch` 的 `TlsInitializationFailed` 错误
  • ABAQUS铺层复合材料冲击损伤仿真的VUMAT子程序开发:简单易学,全方位损伤模拟及数据分析
  • VScode+esp-idf:深入解析ESP32-CAM开发板SD卡文件系统操作
  • STM32单片机驱动TM1620数码管显示模块实战(附完整代码解析)
  • 基于 MATLAB GUI 的语音信号滤波系统功能说明