变量和常量是程序中存储数据的基本方式。东巴文(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;
}
东巴文提示:局部变量如果不初始化,值是不确定的。建议定义时就初始化!
东巴文作用域分类:
#include <stdio.h>
void function() {
int x = 10; // 局部变量,只在函数内有效
printf("函数内 x = %d\n", x);
}
int main() {
function();
// printf("x = %d\n", x); // 错误:x不可见
return 0;
}
#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;
}
#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 };
#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;
}
#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 变量有类型检查#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;
}
东巴文说明:
#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;
}
东巴文说明:
东巴文常量对比表:
| 方式 | 类型检查 | 作用域 | 调试 | 内存 | 东巴文建议 |
|---|---|---|---|---|---|
#define |
无 | 全局 | 难 | 不占用 | 简单常量 |
const |
有 | 遵循作用域 | 易 | 占用 | 推荐使用 |
enum |
有 | 遵循作用域 | 易 | 占用 | 相关常量 |
东巴文建议:
constenum#define东巴文对比表:
| 特性 | 变量 | 常量 | 东巴文说明 |
|---|---|---|---|
| 可修改性 | 可修改 | 不可修改 | 变量可变,常量不变 |
| 初始化 | 可以后赋值 | 必须定义时初始化 | 常量必须初始化 |
| 内存 | 占用内存 | 占用内存 | 都占用内存 |
| 类型检查 | 有 | 有(const) | 都有类型检查 |
| 作用域 | 遵循作用域规则 | 遵循作用域规则 | 作用域相同 |
void function() {
auto int x = 10; // 默认,通常省略auto
}
东巴文说明:局部变量默认是 auto 类型,自动创建和销毁。
#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 全局变量限制作用域在本文件内。
// file1.c
int global_var = 100;
// file2.c
extern int global_var; // 声明外部变量
void function() {
printf("%d\n", global_var); // 可以访问
}
东巴文说明:extern 用于声明外部变量,扩展全局变量的作用域。
void function() {
register int i; // 建议存储在寄存器中
for (i = 0; i < 1000000; i++) {
// 频繁使用的变量
}
}
东巴文提示:
register 只是建议,编译器可能忽略register 变量不能取地址const int MAX = 100; // 常量
int const *p; // 指向常量的指针(指针可变,数据不可变)
int * const p; // 常量指针(指针不可变,数据可变)
const int * const p; // 指向常量的常量指针(都不可变)
东巴文记忆法:
const 在 * 左边:指向常量const 在 * 右边:指针常量volatile int flag; // 易变变量,每次都从内存读取
东巴文应用:
void func(int * restrict a, int * restrict b) {
// a和b不会指向同一内存区域
}
东巴文说明:restrict 是C99新增的限定符,用于优化指针访问。
// ✅ 好的命名
int studentCount;
float averageScore;
char userName[50];
const int MAX_STUDENT = 100;
// ❌ 不好的命名
int a;
float b;
char c[50];
// ✅ 推荐:定义时初始化
int x = 0;
float y = 0.0f;
char c = '\0';
int *ptr = NULL;
// ❌ 不推荐:未初始化
int x; // 值不确定
// ✅ 使用const保护数据
void printString(const char *str) {
printf("%s\n", str);
// str[0] = 'X'; // 错误:不能修改
}
// ✅ 使用const定义常量
const int MAX_SIZE = 100;
const float PI = 3.14159f;
// ❌ 不推荐:过多使用全局变量
int global_count;
void function1() {
global_count++;
}
void function2() {
global_count--;
}
// ✅ 推荐:使用局部变量和参数传递
void function1(int *count) {
(*count)++;
}
void function2(int *count) {
(*count)--;
}
// ❌ 不推荐:魔法数字
if (score >= 60) {
printf("及格\n");
}
// ✅ 推荐:使用常量
const int PASS_SCORE = 60;
if (score >= PASS_SCORE) {
printf("及格\n");
}
完成本章学习后,请确认:
掌握变量与常量后,你可以继续学习:
如果遇到问题,欢迎访问 东巴文(db-w.cn) 获取帮助!
东巴文(db-w.cn) - 让编程学习更简单
📦 东巴文变量常量提示:变量和常量是程序的基础,合理使用它们是编写高质量程序的关键。在 db-w.cn,我们会通过大量实例帮你掌握变量和常量的使用!