变量与常量

数据的容器

变量和常量是程序中存储数据的基本方式。东巴文(db-w.cn) 将带你深入理解变量和常量的概念,掌握数据的存储和使用方法。

💡 东巴文观点:变量是可变的容器,常量是不可变的容器。合理使用变量和常量,是编写高质量程序的基础。

变量

什么是变量?

变量是程序中用于存储数据的命名存储空间。

东巴文比喻

  • 变量就像一个盒子
  • 变量名是盒子的标签
  • 变量值是盒子里装的东西
  • 数据类型是盒子的大小和形状

变量的定义

基本语法

数据类型 变量名;
数据类型 变量名 = 初始值;

示例

int age;              // 定义变量
int age = 25;         // 定义并初始化
int a, b, c;          // 定义多个变量
int x = 10, y = 20;   // 定义并初始化多个变量

变量的命名规则

东巴文命名规范

✅ 合法的变量名

int age;              // 字母开头
int student_name;     // 包含下划线
int value1;           // 包含数字
int _count;           // 下划线开头
int MAX_SIZE;         // 全大写(通常用于常量)

❌ 非法的变量名

int 2nd_place;        // 数字开头
int my-var;           // 包含连字符
int int;              // 使用关键字
int my var;           // 包含空格

东巴文命名建议

  • 使用有意义的名称
  • 采用驼峰命名法或下划线命名法
  • 避免使用单个字母(循环变量除外)

变量的使用

#include <stdio.h>

int main() {
    // 定义变量
    int age;
    
    // 赋值
    age = 25;
    
    // 使用变量
    printf("年龄:%d\n", age);
    
    // 修改值
    age = 26;
    printf("新年龄:%d\n", age);
    
    return 0;
}

变量的初始化

#include <stdio.h>

int main() {
    // ✅ 推荐:定义时初始化
    int x = 0;
    float y = 0.0f;
    char c = '\0';
    
    // ⚠️ 不推荐:未初始化
    int a;  // 值不确定(可能是垃圾值)
    
    printf("x = %d\n", x);
    printf("y = %f\n", y);
    printf("c = %d\n", c);
    
    return 0;
}

东巴文提示:局部变量如果不初始化,值是不确定的。建议定义时就初始化!

变量的作用域

东巴文作用域分类

1. 局部变量

#include <stdio.h>

void function() {
    int x = 10;  // 局部变量,只在函数内有效
    printf("函数内 x = %d\n", x);
}

int main() {
    function();
    // printf("x = %d\n", x);  // 错误:x不可见
    return 0;
}

2. 全局变量

#include <stdio.h>

int global_var = 100;  // 全局变量,整个程序有效

void function() {
    printf("函数内:全局变量 = %d\n", global_var);
    global_var++;  // 修改全局变量
}

int main() {
    printf("main:全局变量 = %d\n", global_var);
    function();
    printf("main:全局变量 = %d\n", global_var);  // 101
    return 0;
}

3. 块级变量

#include <stdio.h>

int main() {
    int x = 10;
    
    {
        int y = 20;  // 块级变量,只在代码块内有效
        printf("块内:x=%d, y=%d\n", x, y);
    }
    
    // printf("y=%d\n", y);  // 错误:y不可见
    printf("块外:x=%d\n", x);
    
    return 0;
}

东巴文提示:变量作用域决定了变量的可见范围和生命周期。

变量的生命周期

东巴文生命周期表

变量类型 作用域 生命周期 存储位置 东巴文说明
局部变量 函数内 函数调用期间 栈区 自动创建和销毁
全局变量 整个程序 程序运行期间 全局区 程序开始创建,结束销毁
静态局部变量 函数内 程序运行期间 全局区 只初始化一次
块级变量 代码块内 代码块执行期间 栈区 自动创建和销毁

常量

什么是常量?

常量是程序中固定不变的值。

东巴文比喻:常量就像一个密封的盒子,一旦装好东西就不能再改变。

常量的分类

东巴文常量分类

常量
├── 字面常量
│   ├── 整数常量:42, 0xFF
│   ├── 浮点常量:3.14, 1.5e-3
│   ├── 字符常量:'A', '\n'
│   └── 字符串常量:"东巴文"
├── const修饰的常量
│   └── const int MAX = 100;
├── 宏定义常量
│   └── #define MAX 100
└── 枚举常量
    └── enum { RED, GREEN, BLUE };

1. 字面常量

#include <stdio.h>

int main() {
    // 整数常量
    int a = 42;          // 十进制
    int b = 0xFF;        // 十六进制
    int c = 077;         // 八进制
    
    // 浮点常量
    float f = 3.14f;
    double d = 3.14159;
    double e = 1.5e-3;   // 科学计数法
    
    // 字符常量
    char ch = 'A';
    char newline = '\n';
    
    // 字符串常量
    char *str = "东巴文";
    
    printf("整数:%d\n", a);
    printf("浮点:%f\n", d);
    printf("字符:%c\n", ch);
    printf("字符串:%s\n", str);
    
    return 0;
}

2. const修饰的常量

#include <stdio.h>

int main() {
    const int MAX_SIZE = 100;
    const float PI = 3.14159f;
    const char NEWLINE = '\n';
    
    printf("最大值:%d\n", MAX_SIZE);
    printf("圆周率:%f\n", PI);
    
    // MAX_SIZE = 200;  // 错误:不能修改const变量
    
    return 0;
}

东巴文说明

  • const 变量必须在定义时初始化
  • const 变量不能被修改
  • const 变量有类型检查

3. 宏定义常量

#include <stdio.h>

#define MAX_SIZE 100
#define PI 3.14159
#define NEWLINE '\n'
#define SQUARE(x) ((x) * (x))

int main() {
    printf("最大值:%d\n", MAX_SIZE);
    printf("圆周率:%f\n", PI);
    printf("平方:%d\n", SQUARE(5));
    
    return 0;
}

东巴文说明

  • 宏定义是文本替换,没有类型检查
  • 宏定义在预处理阶段展开
  • 注意加括号避免优先级问题

4. 枚举常量

#include <stdio.h>

// 枚举常量
enum Weekday {
    SUNDAY,    // 0
    MONDAY,    // 1
    TUESDAY,   // 2
    WEDNESDAY, // 3
    THURSDAY,  // 4
    FRIDAY,    // 5
    SATURDAY   // 6
};

// 指定值的枚举
enum Color {
    RED = 1,
    GREEN = 2,
    BLUE = 3
};

int main() {
    enum Weekday today = WEDNESDAY;
    enum Color favorite = BLUE;
    
    printf("今天是星期%d\n", today + 1);  // 4
    printf("最喜欢的颜色:%d\n", favorite);  // 3
    
    return 0;
}

东巴文说明

  • 枚举常量是整数类型
  • 默认从0开始,依次递增
  • 可以指定值

常量对比

东巴文常量对比表

方式 类型检查 作用域 调试 内存 东巴文建议
#define 全局 不占用 简单常量
const 遵循作用域 占用 推荐使用
enum 遵循作用域 占用 相关常量

东巴文建议

  • 一般常量使用 const
  • 相关的一组常量使用 enum
  • 简单的文本替换使用 #define

变量与常量的区别

东巴文对比表

特性 变量 常量 东巴文说明
可修改性 可修改 不可修改 变量可变,常量不变
初始化 可以后赋值 必须定义时初始化 常量必须初始化
内存 占用内存 占用内存 都占用内存
类型检查 有(const) 都有类型检查
作用域 遵循作用域规则 遵循作用域规则 作用域相同

存储类型关键字

auto

void function() {
    auto int x = 10;  // 默认,通常省略auto
}

东巴文说明:局部变量默认是 auto 类型,自动创建和销毁。

static

静态局部变量

#include <stdio.h>

void counter() {
    static int count = 0;  // 静态局部变量
    count++;
    printf("调用次数:%d\n", count);
}

int main() {
    counter();  // 输出:1
    counter();  // 输出:2
    counter();  // 输出:3
    return 0;
}

东巴文说明static 局部变量只初始化一次,生命周期贯穿整个程序。

静态全局变量

// file1.c
static int global_var = 100;  // 只在本文件可见

// file2.c
extern int global_var;  // 错误:无法访问

东巴文说明static 全局变量限制作用域在本文件内。

extern

// file1.c
int global_var = 100;

// file2.c
extern int global_var;  // 声明外部变量

void function() {
    printf("%d\n", global_var);  // 可以访问
}

东巴文说明extern 用于声明外部变量,扩展全局变量的作用域。

register

void function() {
    register int i;  // 建议存储在寄存器中
    for (i = 0; i < 1000000; i++) {
        // 频繁使用的变量
    }
}

东巴文提示

  • register 只是建议,编译器可能忽略
  • register 变量不能取地址
  • 适用于频繁使用的变量

类型限定符

const

const int MAX = 100;     // 常量
int const *p;            // 指向常量的指针(指针可变,数据不可变)
int * const p;           // 常量指针(指针不可变,数据可变)
const int * const p;     // 指向常量的常量指针(都不可变)

东巴文记忆法

  • const* 左边:指向常量
  • const* 右边:指针常量

volatile

volatile int flag;  // 易变变量,每次都从内存读取

东巴文应用

  • 硬件寄存器
  • 多线程共享变量
  • 信号处理函数中的变量

restrict

void func(int * restrict a, int * restrict b) {
    // a和b不会指向同一内存区域
}

东巴文说明restrict 是C99新增的限定符,用于优化指针访问。

东巴文最佳实践

1. 变量命名规范

// ✅ 好的命名
int studentCount;
float averageScore;
char userName[50];
const int MAX_STUDENT = 100;

// ❌ 不好的命名
int a;
float b;
char c[50];

2. 及时初始化

// ✅ 推荐:定义时初始化
int x = 0;
float y = 0.0f;
char c = '\0';
int *ptr = NULL;

// ❌ 不推荐:未初始化
int x;  // 值不确定

3. 合理使用const

// ✅ 使用const保护数据
void printString(const char *str) {
    printf("%s\n", str);
    // str[0] = 'X';  // 错误:不能修改
}

// ✅ 使用const定义常量
const int MAX_SIZE = 100;
const float PI = 3.14159f;

4. 避免全局变量

// ❌ 不推荐:过多使用全局变量
int global_count;

void function1() {
    global_count++;
}

void function2() {
    global_count--;
}

// ✅ 推荐:使用局部变量和参数传递
void function1(int *count) {
    (*count)++;
}

void function2(int *count) {
    (*count)--;
}

5. 使用有意义的常量名

// ❌ 不推荐:魔法数字
if (score >= 60) {
    printf("及格\n");
}

// ✅ 推荐:使用常量
const int PASS_SCORE = 60;
if (score >= PASS_SCORE) {
    printf("及格\n");
}

东巴文验证清单

完成本章学习后,请确认:

  • 理解变量的概念和作用
  • 掌握变量的定义和初始化
  • 了解变量的命名规则
  • 理解变量的作用域和生命周期
  • 掌握常量的定义方式
  • 了解const、#define、enum的区别
  • 掌握存储类型关键字的使用
  • 掌握类型限定符的使用
  • 能合理使用变量和常量

下一步学习

掌握变量与常量后,你可以继续学习:

如果遇到问题,欢迎访问 东巴文(db-w.cn) 获取帮助!


东巴文(db-w.cn) - 让编程学习更简单

📦 东巴文变量常量提示:变量和常量是程序的基础,合理使用它们是编写高质量程序的关键。在 db-w.cn,我们会通过大量实例帮你掌握变量和常量的使用!