- C 编程教程
- C - 首页
- C 语言基础
- C - 概述
- C - 特性
- C - 历史
- C - 环境设置
- C - 程序结构
- C - Hello World
- C - 编译过程
- C - 注释
- C - 词法单元
- C - 关键字
- C - 标识符
- C - 用户输入
- C - 基本语法
- C - 数据类型
- C - 变量
- C - 整数提升
- C - 类型转换
- C - 类型强制转换
- C - 布尔值
- C 语言中的常量和字面量
- C - 常量
- C - 字面量
- C - 转义序列
- C - 格式说明符
- C 语言中的运算符
- C - 运算符
- C - 算术运算符
- C - 关系运算符
- C - 逻辑运算符
- C - 位运算符
- C - 赋值运算符
- C - 一元运算符
- C - 自增和自减运算符
- C - 三元运算符
- C - sizeof 运算符
- C - 运算符优先级
- C - 其他运算符
- C 语言中的决策
- C - 决策
- C - if 语句
- C - if...else 语句
- C - 嵌套 if 语句
- C - switch 语句
- C - 嵌套 switch 语句
- C 语言中的循环
- C - 循环
- C - while 循环
- C - for 循环
- C - do...while 循环
- C - 嵌套循环
- C - 无限循环
- C - break 语句
- C - continue 语句
- C - goto 语句
- C 语言中的函数
- C - 函数
- C - 主函数
- C - 按值传递函数调用
- C - 按引用传递函数调用
- C - 嵌套函数
- C - 可变参数函数
- C - 用户定义函数
- C - 回调函数
- C - 返回语句
- C - 递归
- C 语言中的作用域规则
- C - 作用域规则
- C - 静态变量
- C - 全局变量
- C 语言中的数组
- C - 数组
- C - 数组的特性
- C - 多维数组
- C - 将数组传递给函数
- C - 从函数返回数组
- C - 可变长数组
- C 语言中的指针
- C - 指针
- C - 指针和数组
- C - 指针的应用
- C - 指针运算
- C - 指针数组
- C - 指针到指针
- C - 将指针传递给函数
- C - 从函数返回指针
- C - 函数指针
- C - 指向数组的指针
- C - 指向结构体的指针
- C - 指针链
- C - 指针与数组
- C - 字符指针和函数
- C - 空指针
- C - void 指针
- C - 野指针
- C - 解引用指针
- C - 近指针、远指针和巨大指针
- C - 指针数组的初始化
- C - 指针与多维数组
- C 语言中的字符串
- C - 字符串
- C - 字符串数组
- C - 特殊字符
- C 语言中的结构体和联合体
- C - 结构体
- C - 结构体和函数
- C - 结构体数组
- C - 自引用结构体
- C - 查找表
- C - 点 (.) 运算符
- C - 枚举 (或 enum)
- C - 结构体填充和打包
- C - 嵌套结构体
- C - 匿名结构体和联合体
- C - 联合体
- C - 位域
- C - Typedef
- C 语言中的文件处理
- C - 输入 & 输出
- C - 文件 I/O(文件处理)
- C 预处理器
- C - 预处理器
- C - 预处理程序
- C - 预处理器运算符
- C - 宏
- C - 头文件
- C 语言中的内存管理
- C - 内存管理
- C - 内存地址
- C - 存储类别
- 其他主题
- C - 错误处理
- C - 可变参数
- C - 命令执行
- C - 数学函数
- C - static 关键字
- C - 随机数生成
- C - 命令行参数
- C 编程资源
- C - 问答
- C - 快速指南
- C - 速查表
- C - 有用资源
- C - 讨论
C - 常量
在 C 语言中,常量是指分配给内存中某个位置的用户自定义名称,其值一旦声明后便无法修改。这与 C 语言中的变量形成对比,变量也是一个命名内存位置,但其值在代码执行过程中可以更改。
建议在程序中定义一个常量并使用它,而不是重复使用硬编码值。C 程序中的常量通常用于引用一个值,如果该值在程序中重复使用,则可能容易出错,同时其值不太可能发生变化。
例如,数学常数 PI 的值为一个高精度浮点数 3.14159265359,如果它可能频繁出现,则将其声明为常量并使用其名称。
我们可以将 C 语言中的常量视为只读变量,因为它的值只能随后使用,而不能修改。
您可以通过以下两种方式之一在 C 程序中声明常量:
使用 const 关键字
使用 #define 指令
让我们了解一下在 C 语言中声明常量的这两种方法。
使用 const 关键字定义常量
声明常量的语法如下:
const type NAME = val;
例如:
const float PI = 3.14159265359;
现在,我们可以在任何表达式中使用 PI,就像使用任何变量一样。
示例
请看下面的示例:
#include <stdio.h> int main(){ const float PI = 3.14159265359; float radius = 5; float area = PI*radius*radius; printf ("area: %f", area); return 0; }
输出
运行此代码后,您将获得以下输出:
area: 78.539818
但是,禁止更改常量的值。以下语句会导致编译器错误:
const float PI = 3.14159265359; PI=22/7;
在这里,您将收到以下错误消息:
error: assignment of read-only variable 'PI'
对于 变量,您可以声明一个变量并在程序后面的某个位置为其赋值,但是对于常量,您不能使用相同的流程。
您可以在 C 语言中声明一个常量而不为其赋值。但是,当您尝试在之后为其赋值时,编译器会抛出错误。
const float PI; PI = 3.14159265359;
在这里,您将收到此错误消息:
error: assignment of read-only variable 'PI'
注意:“sizeof” 返回 “size_t”。“size_t” 的无符号整数类型可能会因平台而异。并且,它可能并非在所有地方都是 long unsigned int。在这种情况下,我们使用“%zu” 作为格式字符串而不是“%d”。
这是因为 编译器 在声明时分配了一个随机的垃圾值,您之后无法更改该值。因此,您必须同时声明和初始化常量。
C 语言中的常量可以是任何 数据类型,包括基本数据类型(如 int、float、char)和派生数据类型(如 struct)。
使用 #define 指令定义常量
使用#define 预处理器指令 也是定义常量的一种有效方法。以下是其语法:
#define name = value
请看下面的示例
#define PI = 3.14159265359
尽管如此定义的常量也可以在任何表达式中使用(就像使用 const 关键字定义的常量一样),但两者之间存在差异。
由#define 指令创建的常量不由编译器处理。相反,它们的行为类似于宏,其值在运行时被替换。
另一个值得注意的差异是,使用#define 指令时,您无需提及要分配给常量的值的类型。
示例:使用 #define 定义常量
下面是另一个使用 #define 指令定义常量的示例:
#include <stdio.h> #define LENGTH 10 #define WIDTH 5 #define NEWLINE '\n' int main() { int area; area = LENGTH * WIDTH; printf("length: %d width: %d", LENGTH, WIDTH); printf("%c", NEWLINE); printf("value of area : %d", area); return 0; }
输出
运行此代码后,您将获得以下输出:
length: 10 width: 5 value of area : 50
由于常量也是 C 语言中的 标识符,因此它遵循形成标识符的所有规则。C 语言中的标识符区分大小写。因此,在 C 语言中定义常量时遵循的约定是使用大写字符,但这并非强制性。
更改常量的值
根据定义,常量是不可变的。为什么要在首先更改常量的值?我们使用常量是为了保持其值不变。为了能够更改值,我们将定义一个变量而不是常量。
我们已经看到,无法为已定义的常量分配新值。但是,存在一种变通方法,可以通过该方法为常量分配新值。
该技术利用了 C 语言中指针 的概念。指针是一个存储另一个变量地址的变量。由于它是一个变量,因此可以更改其值。此外,此更改会反映在原始变量中。
示例:更改常量的值
以下代码演示了如何使用指针机制更改常量的值:
#include <stdio.h> int main(){ const int x = 10; printf("Initial Value of Constant: %d\n", x); // y is a pointer to constant x int* y = &x; // assign new value *y = 100; printf("Value of Constant after change: %d", x); return 0; }
输出
执行此代码后,您将获得以下输出:
Initial Value of Constant: 10 Value of Constant after change: 100
请注意,此技术仅适用于使用const限定符定义的常量。
如果您使用#define 指令定义了常量,则无法应用此过程。这是因为指针具有数据类型,并且必须与要存储其地址的类型相同。另一方面,使用#define 指令定义的常量实际上没有数据类型。它实际上是一个在运行时被替换的宏。