变量与常量

数据的容器

变量和常量是程序中存储数据的基本方式。东巴文(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,我们会通过大量实例帮你掌握变量和常量的使用!