一、概念介绍 生活中的有些值是不变的(比如:圆周率,性别,身份证号码,血型等等)
有些值是可变的(比如:年龄,体重,薪资)。
不变的值,C语言中用常量的概念来表示,变的值C语言中用变量来表示。
二、变量在C语言中,变量是程序中最基本的存储单元,用于存储和操作数据。下面我将全面讲解C语言中定义变量的方法。
1. 基本定义语法代码语言:javascript复制//数据类型 变量名;代码示例代码语言:javascript复制int age; // 定义一个整型变量age
float salary; // 定义一个浮点型变量salary
char grade; // 定义一个字符型变量grade2. 变量的初始化语法代码语言:javascript复制数据类型 变量名 = 初始值;代码展示代码语言:javascript复制int count = 10; // 定义并初始化为10
double pi = 3.14159; // 定义双精度浮点数并初始化
char letter = 'A'; // 定义字符变量并初始化3. 同时定义多个变量语法代码语言:javascript复制数据类型 变量名1, 变量名2, 变量名3;代码展示代码语言:javascript复制int x, y, z; // 定义三个整型变量
float a = 1.2, b = 3.4; // 定义两个浮点变量并初始化4. 不同类型变量的定义1) 基本数据类型代码语言:javascript复制char c; // 字符型,通常1字节
short s; // 短整型,通常2字节
int i; // 整型,通常4字节
long l; // 长整型,通常4或8字节
float f; // 单精度浮点,通常4字节
double d; // 双精度浮点,通常8字节2) 带符号修饰符代码语言:javascript复制signed int si; // 有符号整型(默认)
unsigned int ui; // 无符号整型3) 限定符代码语言:javascript复制const int MAX = 100; // 常量,不可修改5. 变量的作用域1)局部变量概念: 在函数或代码块内部定义的变量
代码语言:javascript复制void function() {
int localVar = 5; // 局部变量
// ...
}2)全局变量概念: 在所有函数外部定义的变量
代码语言:javascript复制int globalVar; // 全局变量
void func1() {
globalVar = 10;
}
void func2() {
globalVar = 20;
}3)静态变量概念: 静态变量是在程序运行期间一直存在的变量,即使离开了它的作用域,其值也会被保留。静态变量存储在内存的静态存储区,而不是栈或堆中
使用static关键字定义的变量
代码语言:javascript复制void func() {
static int count = 0; // 静态局部变量
count++;
}6. 变量的生命周期变量的生命周期指的是变量的创建到变量的销毁之间的一个时间段
局部变量的生命周期是:进入作用域生命周期开始,出作用域生命周期结束。全局变量的生命周期是:整个程序的生命周期。
7. 特殊变量特殊变量我会在后期连续出文展去深度讲解,这里我们只作基本概念的解读
1) 指针变量代码语言:javascript复制int *ptr; // 整型指针
char *str; // 字符型指针
void *vp; // 无类型指针2) 数组变量代码语言:javascript复制int arr[10]; // 整型数组
char name[20]; // 字符数组(字符串)
float matrix[3][3]; // 二维浮点数组3) 结构体变量代码语言:javascript复制struct Point {
int x;
int y;
};
struct Point p1; // 结构体变量4) 联合体变量代码语言:javascript复制union Data {
int i;
float f;
char str[20];
};
union Data data; // 联合体变量5) 枚举变量代码语言:javascript复制enum Color {RED, GREEN, BLUE};
enum Color c = RED; // 枚举变量7. 变量命名规则 变量命名规则
只能包含字母、数字和下划线
不能以数字开头
不能使用C语言关键字
区分大小写
应具有描述性
三、常量在C语言中,变量是程序中最基本的存储单元,用于存储和操作数据。下面我将全面讲解C语言中定义变量的方法。
1. 使用#define预处理器定义常量基本语法代码语言:javascript复制#define 常量名 常量值特点 预处理阶段进行文本替换
没有类型检查
不占用内存空间
作用域从定义处到文件结束
代码示例
代码语言:javascript复制#define PI 3.1415926
#define MAX_SIZE 100
#define WELCOME_MSG "Hello, World!"拓展:带参数的宏常量代码语言:javascript复制#define SQUARE(x) ((x)*(x))
#define MAX(a,b) ((a)>(b)?(a):(b))这两行代码是C语言中使用#define预处理指令定义的宏(macro),它们分别实现了计算平方和求最大值的功能。下面我将详细解释它们的含义和工作原理:
1. #define SQUARE(x) ((x)*(x))
作用:
定义一个计算平方的宏,将输入的参数x平方后返回结果分解解释:
#define:预处理指令,用于定义宏
SQUARE(x):宏名称为SQUARE,带有一个参数x
((x)*(x)):宏的展开内容,计算x乘以x
代码语言:javascript复制int num = 5;
int result = SQUARE(num); // 展开为:((num)*(num)) → 5*5 = 252. #define MAX(a,b) ((a)>(b)?(a):(b))
作用:
定义一个求最大值的宏,返回两个参数a和b中的较大值分解解释:
#define:预处理指令
MAX(a,b):宏名称为MAX,带有两个参数a和b
((a)>(b)?(a):(b)):使用三目运算符(条件运算符):
如果(a)>(b)为真,返回(a)
否则返回(b)
代码语言:javascript复制int x = 10, y = 20;
int max = MAX(x, y); // 展开为:((x)>(y)?(x):(y)) → 202. 使用const关键字定义常量 在C语言中,const修饰的是常变量
在C++中,const修饰的就是常量
1) 基本语法代码语言:javascript复制const 数据类型 常量名 = 值;2) 特点 编译时进行类型检查
占用内存空间
有明确的作用域规则
不能被修改
代码示例
代码语言:javascript复制const int MAX = 100;
const float PI = 3.14159f;
const char NEWLINE = '\n';3. 字符/字符串字面量字符常量(如 ‘A’): 实际存储为ASCII码值(65)
在C标准中被定义为int类型(占4字节),而非char(历史原因)
代码语言:javascript复制printf("%d", sizeof('A')); // 输出4(在大多数系统中)字符串常量(如 “ABC”): 存储为连续的字符内存块 + 终止符’\0’
实际是const char[]类型的匿名数组
代码语言:javascript复制printf("%d", sizeof("A")); // 输出2('A' + '\0') 在 C 语言中,%s 是用于输出 字符串(字符数组) 的格式说明符。它专门用于处理以 \0 (null 字符) 结尾的字符数组(即 C 风格的字符串)。以下是详细说明和用法示例:
代码语言:javascript复制char str[] = "Hello World";
printf("%s", str); // 输出整个字符串后面我们会详细介绍C语言的字符串的用法
C语言同时存在字符常量和字符串常量,本质上是因为:
数据类型不同:一个是整型值,一个是字符数组
内存表示不同:单字节 vs 连续内存块
操作需求不同:寄存器运算 vs 指针操作
历史传承:延续了低级语言对字符和字符串的区分
4. 使用enum枚举定义常量1. 基本语法代码语言:javascript复制enum 枚举名 {常量1, 常量2, ...};2. 特点 定义一组相关的整型常量
默认从0开始递增
可以显式指定值
有类型检查
枚举常量必须是整型值
代码示例
代码语言:javascript复制// 定义电梯状态
enum ElevatorState {
IDLE, // 空闲状态(0)
MOVING_UP, // 上升中(1)
MOVING_DOWN,// 下降中(2)
EMERGENCY_STOP // 紧急停止(3)
};
// 使用示例
enum ElevatorState currentState = IDLE; //currentState是变量名字,IDLE给变量初始化
void handleElevator() {
switch(currentState) {
case IDLE:
printf("电梯待命\n");
break;
case MOVING_UP:
printf("电梯上升中\n");
break;
// 其他状态处理...
}
}后期我会利用枚举类与其它知识的结合去编写完整的电梯状态机的代码
各位看官想必看到这里已经很辛苦了,小编来自发一杯
最后,如果你喜欢我的文章,记得给个三连哦