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

C语言---常量

文章目录

  • 常量分类
    • 1. 整型常量
    • 2. 实型常量(浮点型常量)
    • 3. 字符常量
    • 4. 字符串常量
    • 5. 符号常量
      • a) 使用 #define 定义
      • b) 使用 const 关键字定义
      • #define 与 const 区别
    • 总结与对比

常量是固定值,在程序执行期间不会改变。这些固定的值,又叫做字面量。
常量可以是任何的基本数据类型,比如整数常量、浮点常量、字符常量,或字符串字面值,也有枚举常量。

常量分类

1. 整型常量

整型常量就是整数的常量,可以用三种进制来表示:
十进制整数:
由数字 0~9 和正负号组成。例如: 123, -456, 0
八进制整数:
以数字 0 开头,由数字 0~7 组成。例如: 0123 (等于十进制的83), 010 (等于十进制的8)
十六进制整数:
以 0x 或 0X 开头,由数字 0~9 和字母 A~F (或 a~f) 组成。例如: 0x123 (等于十进制的291), 0XFF (等于十进制的255), 0x1a (等于十进制的26)
可以在整数后面加上后缀来指定其类型:
1、L 或 l: 表示长整型 (long),例如 123L
2、LL 或 ll: 表示长长整型 (long long),例如 123LL
3、U 或 u: 表示无符号整型 (unsigned),例如 123U
后缀可以组合使用,如 123UL 表示无符号长整型。

2. 实型常量(浮点型常量)

实型常量就是数学中的小数,在C语言中也称为浮点数。它有两种表示形式:
小数形式: 由数字、小数点和正负号组成。必须包含小数点。
例如: 3.14, -0.123, .618 (等价于0.618), 5. (等价于5.0)
指数形式: 格式为 [±] 数字 [.数字] e|E [±] 数字。
例如:
1.23e5 表示 1.23 × 10⁵ (即123000)
5.6E-3 表示 5.6 × 10⁻³ (即0.0056)
-7.8e+2 表示 -7.8 × 10² (即-780)
默认情况下,实型常量是 double 类型。可以在后面加上后缀来指定类型:
F 或 f: 表示单精度浮点型 (float),例如 3.14f
L 或 l: 表示长双精度浮点型 (long double),例如 3.14L

3. 字符常量

字符常量是用单引号 ‘’ 括起来的一个字符。
普通字符: 例如 ‘A’, ‘b’, ‘5’, ‘#’
转义字符: 以反斜杠 \ 开头,用于表示一些特殊的、无法直接输入的字符。常见的转义字符有:
\n: 换行符
\t: 制表符 (Tab)
\: 反斜杠本身
': 单引号
": 双引号
\0: 空字符 (NULL),字符串的结束标志
\xhh: 用1-2位十六进制数表示字符,如 \x41 表示 ‘A’
\ddd: 用1-3位八进制数表示字符,如 \101 也表示 ‘A’

字符常量在内存中存储的是其对应的ASCII码值(一个整数)。例如,‘A’ 的值就是65。

4. 字符串常量

字符串常量是用双引号 “” 括起来的一个或多个字符序列。
例如: “Hello, World!”, “A”, “123”, “你好”, “” (空字符串)
重要:字符串常量和字符常量的区别
“A” 是字符串常量,它在内存中占两个字节:‘A’ 和 ‘\0’ (结束符)。

‘A’ 是字符常量,它在内存中占一个字节:65 (ASCII码)。

5. 符号常量

符号常量是使用预处理指令 #define 或关键字 const 定义的标识符,用来代表一个常量。

a) 使用 #define 定义

这是在预处理阶段进行简单文本替换的宏定义。

#include <stdio.h>#define PI 3.14159       // 定义符号常量PI,值为3.14159
#define MAX_SIZE 100     // 定义符号常量MAX_SIZE,值为100
#define GREETING "Hello" // 定义字符串符号常量int main() {double radius = 5.0;double area = PI * radius * radius; // 预处理后此行变为 double area = 3.14159 * radius * radius;int arr[MAX_SIZE]; // 预处理后变为 int arr[100];printf("%s\n", GREETING);printf("Area is: %f\n", area);return 0;
}

特点:
不加分号 ;。
只是简单的文本替换,不占用内存,没有数据类型的概念。

b) 使用 const 关键字定义

这是在编译阶段处理的,会分配存储空间,具有明确的类型检查。

#include <stdio.h>int main() {const double PI = 3.14159;     // 定义const常量PIconst int MAX_SIZE = 100;const char GREETING[] = "Hello";// PI = 3.14; // 错误!试图修改const常量的值,编译器会报错double radius = 5.0;double area = PI * radius * radius;int arr[MAX_SIZE];printf("%s\n", GREETING);printf("Area is: %f\n", area);return 0;
}

特点:
需要指定数据类型。
定义时必须初始化。
试图修改它的值会导致编译错误。
具有作用域的概念(例如,在函数内定义的const常量只在该函数内有效)。

#define 与 const 区别

替换机制:#define 是进行简单的文本替换,而 const 是声明一个具有类型的常量。#define 定义的常量在编译时会被直接替换为其对应的值,而 const 定义的常量在程序运行时会分配内存,并且具有类型信息。

类型检查:#define 不进行类型检查,因为它只是进行简单的文本替换。而 const 定义的常量具有类型信息,编译器可以对其进行类型检查。这可以帮助捕获一些潜在的类型错误。

作用域:#define 定义的常量没有作用域限制,它在定义之后的整个代码中都有效。而 const 定义的常量具有块级作用域,只在其定义所在的作用域内有效。

调试和符号表:使用 #define 定义的常量在符号表中不会有相应的条目,因为它只是进行文本替换。而使用 const 定义的常量会在符号表中有相应的条目,有助于调试和可读性。

总结与对比

常量类型表示方式示例特点
整型常量十进制、八进制(0开头)、十六进制(0x开头)123, 0123, 0x1A3可加L、U等后缀指定类型
实型常量小数形式、指数形式3.14, -1.2e-5默认double,可加F、L后缀
字符常量单引号 ‘’‘A’, ‘\n’存储的是ASCII码值,占1字节
字符串常量双引号 “”“Hello”以’\0’结尾,占字符数+1字节
符号常量(#define)#define 标识符 常量值#define PI 3.14预处理替换,无类型,不分配内存
符号常量(const)const 类型 标识符 = 值;const float pi = 3.14;有类型,分配内存,不可修改

文章转载自:

http://vPGT4Tdy.qmnjn.cn
http://g7jwvXgr.qmnjn.cn
http://jvVbkvYu.qmnjn.cn
http://3jgXAw1p.qmnjn.cn
http://OuM090vo.qmnjn.cn
http://pI5zlfil.qmnjn.cn
http://3ymOhXOq.qmnjn.cn
http://2omlwBLN.qmnjn.cn
http://HQA6Bne0.qmnjn.cn
http://BzRasNJ7.qmnjn.cn
http://T9tuvvHV.qmnjn.cn
http://I7duC3gw.qmnjn.cn
http://0lNayWR2.qmnjn.cn
http://kfIKCFSr.qmnjn.cn
http://HqkNwGHz.qmnjn.cn
http://ydvl2oEX.qmnjn.cn
http://Kpodf6tW.qmnjn.cn
http://Sf4q8TYd.qmnjn.cn
http://TeapoDn1.qmnjn.cn
http://I657p150.qmnjn.cn
http://IzQU7KTO.qmnjn.cn
http://qlqQ9Zvc.qmnjn.cn
http://PhOkNMI7.qmnjn.cn
http://HulnO3ks.qmnjn.cn
http://n043epDL.qmnjn.cn
http://ik92npHl.qmnjn.cn
http://1X0uWLHl.qmnjn.cn
http://zQYeCaQ8.qmnjn.cn
http://U4ouEXrW.qmnjn.cn
http://UhFvrTWa.qmnjn.cn
http://www.dtcms.com/a/379483.html

相关文章:

  • 豆包・图像创作模型 Seedream 4.0 正式发布!
  • OCSP(Online Certificate Status Protocol,在线证书状态协议)
  • 深度学习(六):代价函数的意义
  • 【lite.ai.toolkit】【深度学习】【Ubuntu 20.04】C++ 轻量级AI模型工具箱的编译、安装、使用教程
  • 远程创意协作新方式:cpolar助力Drawnix跨地域团队协作
  • 深入理解 Linux 内核进程管理
  • 企业跨区域组网新解:SD-WAN技术打造安全稳定网络体系
  • 单身杯2 web
  • 《Learning Langchain》阅读笔记12-RAG(8):RAG的优化策略
  • daily notes[43]
  • LRU缓存详解:用C语言实现高效数据管理
  • 灵码产品演示:软件工程架构分析
  • 硬件电路-陀机
  • swiper插件的使用
  • mysql的各种锁
  • Java大厂面试实录:AIGC与虚拟互动场景下的微服务与AI落地(附知识详解)
  • Kafka 学习笔记
  • 机械零件极限应力线图
  • 萤石安全生产监管解决方案:构建企业安全智能化防护网
  • sqlmap常用命令
  • MID认证:全球电力计量市场的通行证与中国协议兼容性分析
  • STM32开发(USART:IIC总线)
  • Spring框架中用到的设计模式
  • 从源码和设计模式深挖AQS(AbstractQueuedSynchronizer)
  • 四、计算机网络与分布式系统(中)
  • 半导体学习笔记
  • 深入解析Dart虚拟机运行原理
  • 一文教您解决Ubuntu ModuleNotFoundError: No module named ‘_tkinter‘问题
  • 部署合约常见的问题
  • Python快速入门专业版(二十三):for循环基础:遍历字符串、列表与range()函数(计数案例)