C语言常量和存储类别详解
常量与字面量
基本概念
常量是指在程序执行过程中不会更改的固定值,也称为字面量。常量可以是任何基本数据类型,包括整数常量、浮点常量、字符常量或字符串文字,以及枚举常量。
整数字面量
表示方式:
十进制:无前缀
八进制:以0为前缀
十六进制:以0x或0X为前缀
后缀说明:
U:无符号整数
L:长整数
可大写或小写,顺序任意
合法示例:
c
212 /* 十进制 */ 215u /* 无符号十进制 */ 0xFeeL /* 十六进制长整数 */
非法示例:
c
078 /* 非法:8不是八进制数字 */ 032UU /* 非法:不能重复后缀 */
更多示例:
c
85 /* 十进制 */ 0213 /* 八进制 */ 0x4b /* 十六进制 */ 30 /* int */ 30u /* unsigned int */ 30l /* long */ 30ul /* unsigned long */
浮点字面量
组成结构:
整数部分
小数点
小数部分
指数部分(用e或E引入)
合法示例:
c
3.14159 /* 合法 */ 314159E-5L /* 合法 */
非法示例:
c
510E /* 非法:指数不完整 */ 210f /* 非法:无小数或指数 */ .e55 /* 非法:缺少整数或小数部分 */
字符字面量
表示方式: 用单引号括起来
类型:
普通字符:'x'
转义序列:'\t'
通用字符:'\u02C0'
常用转义序列:
转义序列 | 含义 |
---|---|
\\ | \字符 |
\' | '字符 |
\" | "字符 |
\? | ?字符 |
\a | 警报或铃声 |
\b | 退格键 |
\f | 换页 |
\n | 新行 |
\r | 回车 |
\t | 水平制表 |
\v | 垂直制表 |
\ooo | 八进制数 |
\xhh... | 十六进制数 |
示例程序:
c
#include <stdio.h>int main() {printf("Hello\tWorld\n\n");return 0; }
输出结果:
text
Hello World
字符串字面量
表示方式: 用双引号括起来
多行表示:
c
"hello, dear""hello, \ dear""hello, " "d" "ear"
以上三种形式表示相同的字符串。
定义常量的方法
1. 使用#define预处理指令
c
#define identifier value
示例:
c
#include <stdio.h>#define LENGTH 10 #define WIDTH 5 #define NEWLINE '\n'int main() {int area; area = LENGTH * WIDTH;printf("value of area : %d", area);printf("%c", NEWLINE);return 0; }
输出结果:
text
value of area : 50
2. 使用const关键字
c
const type variable = value;
示例:
c
#include <stdio.h>int main() {const int LENGTH = 10;const int WIDTH = 5;const char NEWLINE = '\n';int area; area = LENGTH * WIDTH;printf("value of area : %d", area);printf("%c", NEWLINE);return 0; }
输出结果:
text
value of area : 50
存储类别
存储类定义了变量和函数的作用域(可见性)和生存期,包括四种类型:
auto
register
static
extern
auto存储类别
所有局部变量的默认存储类。
c
{int mount; // 默认为autoauto int month; // 显式声明为auto }
register存储类别
用于定义应存储在寄存器中的局部变量。
c
{register int miles; // 建议编译器存储在寄存器中 }
特点:
变量大小等于寄存器大小
不能应用&运算符
适用于需要快速访问的变量(如计数器)
static存储类别
局部静态变量: 在函数调用之间保持值不变
全局静态变量: 作用域限制在声明它的文件中
示例程序:
c
#include <stdio.h>/* 函数声明 */ void func(void);static int count = 5; /* 全局静态变量 */int main() {while(count--) {func();}return 0; }/* 函数定义 */ void func(void) {static int i = 5; /* 局部静态变量 */i++;printf("i is %d and count is %d\n", i, count); }
输出结果:
text
i is 6 and count is 4 i is 7 and count is 3 i is 8 and count is 2 i is 9 and count is 1 i is 10 and count is 0
extern存储类别
用于在多个文件间共享全局变量和函数。
文件1:main.c
c
#include <stdio.h>int count; extern void write_extern();int main() {count = 5;write_extern();return 0; }
文件2:support.c
c
#include <stdio.h>extern int count;void write_extern(void) {printf("count is %d\n", count); }
编译和执行:
bash
gcc main.c support.c ./a.out
输出结果:
text
count is 5
最佳实践建议
常量定义:建议在源码头部定义常量,提高代码可读性和可维护性
存储类别选择:
局部变量使用auto(默认)
频繁使用的计数器考虑register
需要保持值的局部变量使用static
多文件共享的全局变量使用extern
通过合理使用常量和存储类别,可以编写出更高效、更易维护的C语言程序。