C语言中的变量与常量
变量
定义
变量是程序中用于存储数据的容器。在C语言中,变量需要先声明后使用,声明时需要指定变量的类型。变量的类型决定了变量可以存储的数据类型以及变量在内存中的大小。
命名规则
C 语言变量命名规则
规则 | 详细说明 | 示例 |
---|---|---|
字符组成 | 变量名只能包含字母(a-z、A-Z)、数字(0-9)和下划线(_)。 | int myVariable; |
首字符 | 变量名必须以字母或下划线开头,不能以数字开头。 | int _myVariable; <br>错误示例:int 1variable; |
大小写敏感 | C 语言是大小写敏感的,Variable 和 variable 是两个不同的变量。 | int Variable; <br>int variable; |
有意义的名称 | 变量名应具有描述性,能够表明变量所代表的含义。 | int studentScore; |
避免使用缩写 | 尽量避免使用缩写,除非该缩写在团队中非常通用。 | int studentScore; <br>避免:int sScore; |
驼峰式命名法 | 对于多个单词组成的变量名,使用驼峰式命名法(camelCase)。 | int studentScore; <br>int userAge; |
下划线命名法 | 也可以使用下划线命名法(snake_case),特别是在类的成员变量或全局变量中。 | int student_score; <br>int user_age; |
前缀规则 | 根据变量的作用域和类型使用前缀。 | int c_myVar; (局部变量)<br>int m_myVar; (类的成员变量)<br>int sm_myVar; (类的静态成员变量) |
Vue 3 中的变量命名规则
特性/方法 | 命名规则 | 示例 |
---|---|---|
ref | 使用小写字母开头,驼峰式命名法。 | const count = ref(0); <br>const userName = ref('John'); |
reactive | 使用小写字母开头,驼峰式命名法。 | const state = reactive({ count: 0, userName: 'John' }); |
通用编程变量命名规则
规则 | 详细说明 | 示例 |
---|---|---|
描述性名称 | 变量名应具有描述性,能够表明变量所代表的含义。 | int studentScore; |
驼峰式命名法 | 对于多个单词组成的变量名,使用驼峰式命名法(camelCase)。 | int studentScore; <br>int userAge; |
下划线命名法 | 也可以使用下划线命名法(snake_case),特别是在类的成员变量或全局变量中。 | int student_score; <br>int user_age; |
避免使用缩写 | 尽量避免使用缩写,除非该缩写在团队中非常通用。 | int studentScore; <br>避免:int sScore; |
前缀规则 | 根据变量的作用域和类型使用前缀。 | int c_myVar; (局部变量)<br>int m_myVar; (类的成员变量)<br>int sm_myVar; (类的静态成员变量) |
一致性 | 保持命名的一致性,特别是在团队协作和代码维护中。 | int count; <br>int title; <br>void handleClick(); |
变量数据类型
数据类型 | 关键字 | 用途 | 大小(字节) | 取值范围 | 示例 |
---|---|---|---|---|---|
整型 | int | 存储整数 | 通常为 4 字节 | -2,147,483,648 到 2,147,483,647 | int age = 25; |
short | 存储较短的整数 | 通常为 2 字节 | -32,768 到 32,767 | short count = 100; | |
long | 存储较长的整数 | 通常为 4 字节 | -2,147,483,648 到 2,147,483,647 | long distance = 1000000; | |
long long | 存储非常长的整数 | 通常为 8 字节 | -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807 | long long bigNumber = 1234567890123456789; | |
unsigned int | 存储无符号整数 | 通常为 4 字节 | 0 到 4,294,967,295 | unsigned int index = 1000; | |
unsigned short | 存储无符号短整数 | 通常为 2 字节 | 0 到 65,535 | unsigned short port = 8080; | |
unsigned long | 存储无符号长整数 | 通常为 4 字节 | 0 到 4,294,967,295 | unsigned long size = 1000000; | |
unsigned long long | 存储无符号非常长的整数 | 通常为 8 字节 | 0 到 18,446,744,073,709,551,615 | unsigned long long bigSize = 1234567890123456789; | |
字符型 | char | 存储字符 | 1 字节 | -128 到 127 | char grade = 'A'; |
unsigned char | 存储无符号字符 | 1 字节 | 0 到 255 | unsigned char ch = 255; | |
浮点型 | float | 存储单精度浮点数 | 通常为 4 字节 | 1.2E-38 到 3.4E+38 | float price = 19.99; |
double | 存储双精度浮点数 | 通常为 8 字节 | 2.3E-308 到 1.7E+308 | double salary = 123456.78; | |
long double | 存储扩展精度浮点数 | 通常为 10 或 16 字节 | 3.4E-4932 到 1.1E+4932 | long double pi = 3.14159265358979323846; | |
布尔型 | _Bool | 存储布尔值 | 1 字节 | 0 或 1 | _Bool isTrue = 1; |
指针 | int* | 存储整型变量的地址 | 通常为 4 或 8 字节 | 依赖于系统架构 | int* ptr = &age; |
char* | 存储字符型变量的地址 | 通常为 4 或 8 字节 | 依赖于系统架构 | char* str = "Hello"; | |
float* | 存储浮点型变量的地址 | 通常为 4 或 8 字节 | 依赖于系统架构 | float* p = &price; | |
数组 | int[] | 存储多个整数 | 依赖于数组长度和元素类型 | 依赖于数组长度和元素类型 | int numbers[] = {1, 2, 3, 4, 5}; |
char[] | 存储多个字符 | 依赖于数组长度 | 依赖于数组长度 | char name[] = "John"; | |
float[] | 存储多个浮点数 | 依赖于数组长度和元素类型 | 依赖于数组长度和元素类型 | float prices[] = {19.99, 29.99, 39.99}; | |
结构体 | struct | 存储多个不同类型的数据 | 依赖于成员变量 | 依赖于成员变量 | struct Person { int age; char name[50]; }; |
联合体 | union | 存储多个不同类型的数据,但同一时间只能存储一个 | 依赖于最大成员变量 | 依赖于最大成员变量 | union Data { int i; float f; char str[20]; }; |
枚举 | enum | 存储一组命名的常量 | 通常为 4 字节 | 依赖于枚举值 | enum Weekday { MON, TUE, WED, THU, FRI, SAT, SUN }; |
变量的作用域
变量的作用域是指变量在程序中有效的范围,其中C语言的作用域包括:局部变量、全局变量、块作用域变量、文件作用域变量、静态局部变量、静态全局变量
局部变量
在函数内部声明的变量,只能在该函数内部访问。
void function() {
int localVar = 20; // 局部变量
// 只能在这里访问 localVar
}
全局变量
在函数外部声明的变量,可以在整个程序中访问。
int globalVar = 10; // 全局变量
void function() {
// 可以访问 globalVar
}
块作用域变量
在代码块(如{}
内的代码)中声明的变量,只能在该代码块内访问。
void function() {
{
int blockVar = 30; // 块作用域变量
// 只能在这里访问 blockVar
}
// 不能在这里访问 blockVar
}
文件作用域变量
使用static
关键字在函数外部声明的变量,只能在声明它的文件内部访问。
static int fileScopeVar = 40; // 文件作用域变量
void function() {
// 可以访问 fileScopeVar
}
函数作用域变量(通常指静态局部变量)
在函数内部使用static
关键字声明的变量,它在函数调用之间保持其值,但只能在该函数内部访问。
void function() {
static int staticLocalVar = 50; // 静态局部变量
// 每次调用函数时,staticLocalVar 保持其值
}
静态全局变量
在所有函数外部声明的静态变量,只在定义它的文件内部有效。
static int staticGlobalVar = 40; // 静态全局变量
void func() {
printf("静态全局变量: %d\n", staticGlobalVar);
}
int main() {
func();
// 在其他文件中无法访问 staticGlobalVar
return 0;
}
变量生命周期
生命周期是指变量在程序中存在的时间段,其中C语言的变量生命周期包括静态存储期、自动存储期、动态存储期。
静态存储期
全局变量和静态变量的生命周期从程序开始运行到程序结束。
int globalVar = 60; // 全局变量
static int staticVar = 70; // 静态全局变量
void func() {
static int staticLocalVar = 80; // 静态局部变量
printf("静态局部变量: %d\n", staticLocalVar);
staticLocalVar++;
}
int main() {
printf("全局变量: %d\n", globalVar);
printf("静态全局变量: %d\n", staticVar);
func(); // 输出: 静态局部变量: 80
func(); // 输出: 静态局部变量: 81
return 0;
}
自动存储期
局部变量的生命周期从变量声明开始,到函数结束时结束。
void func() {
int localVar = 50; // 局部变量
printf("局部变量: %d\n", localVar);
// localVar 在函数结束时被销毁
}
int main() {
func();
return 0;
}
动态存储期
通过动态内存分配(如malloc
在C语言中)创建的变量,其生命周期从分配开始,到 free
调用结束。
#include <stdlib.h>
#include <stdio.h>
int main() {
int* dynamicVar = (int*)malloc(sizeof(int)); // 动态分配内存
if (dynamicVar == NULL) {
printf("内存分配失败\n");
return 1;
}
*dynamicVar = 90;
printf("动态分配的变量: %d\n", *dynamicVar);
free(dynamicVar); // 释放内存
return 0;
}
综合例子
#include <stdio.h>
#include <stdlib.h>
// 全局变量
int globalVar = 10;
// 文件作用域变量
static int fileScopeVar = 20;
void function() {
// 静态局部变量
static int staticLocalVar = 30;
// 局部变量
int localVar = 40;
// 块作用域变量
{
int blockVar = 50;
printf("blockVar: %d\n", blockVar); // 可以访问 blockVar
}
// printf("blockVar: %d\n", blockVar); // 错误:blockVar 在这里不可访问
printf("globalVar: %d\n", globalVar); // 可以访问 globalVar
printf("fileScopeVar: %d\n", fileScopeVar); // 可以访问 fileScopeVar
printf("staticLocalVar: %d\n", staticLocalVar); // 可以访问 staticLocalVar
printf("localVar: %d\n", localVar); // 可以访问 localVar
// 动态分配内存
int *dynamicVar = (int*)malloc(sizeof(int));
if (dynamicVar != NULL) {
*dynamicVar = 60;
printf("dynamicVar: %d\n", *dynamicVar); // 可以访问 dynamicVar
// 释放内存
free(dynamicVar);
}
// staticLocalVar 在下次函数调用时保持其值
staticLocalVar++;
printf("Incremented staticLocalVar: %d\n", staticLocalVar);
}
int main() {
function();
function(); // 调用第二次以显示 staticLocalVar 的持久性
// 可以访问 globalVar 和 fileScopeVar,但不能直接访问 localVar、blockVar 和 staticLocalVar(因为它们的作用域不在这里)
printf("globalVar in main: %d\n", globalVar);
printf("fileScopeVar in main: %d\n", fileScopeVar);
return 0;
}
常量
定义
常量是程序中值不能改变的量。常量在声明时必须初始化,并且其值在程序运行过程中不能被修改。
常量类型
- 整数常量:可以是十进制、八进制(以0开头)或十六进制(以0x或0X开头)表示。
#include <stdio.h> int main() { const int MAX_USERS = 100; // 整型常量 printf("最大用户数: %d\n", MAX_USERS); // MAX_USERS = 200; // 错误,常量不能被修改 return 0; }
- 浮点常量:由整数部分、小数点、小数部分和指数部分组成,可以使用小数形式或指数形式表示。
#include <stdio.h> int main() { const float PI = 3.14159; // 浮点型常量 printf("圆周率: %f\n", PI); // PI = 3.14; // 错误,常量不能被修改 return 0; }
- 字符常量:用单引号括起来的单个字符,如'A'、'\n'等。
#include <stdio.h> int main() { const char NEWLINE = '\n'; // 字符型常量 printf("这是一个字符型常量: %c", NEWLINE); // NEWLINE = '\r'; // 错误,常量不能被修改 return 0; }
- 字符串常量:用双引号括起来的字符序列,如"Hello, World!"。
#include <stdio.h> int main() { const char* GREETING = "Hello, World!"; // 字符串常量 printf("%s\n", GREETING); // GREETING = "Hi, World!"; // 错误,常量指针的值不能被修改 return 0; }
- 枚举常量:通过
enum
关键字定义的一组命名的整数常量。#include <stdio.h> enum Weekday { MON, TUE, WED, THU, FRI, SAT, SUN }; int main() { const enum Weekday today = MON; // 枚举常量 printf("今天是: %d\n", today); // today = TUE; // 错误,常量不能被修改 return 0; }
常量的定义方法
在C语言中,常量可以通过以下两种方式定义:
- 使用#define预处理器:
#define
是预处理命令,用于定义符号常量。- 定义形式为:
#define 标识符 常量值
。 - 例如:
#define PI 3.1416
,定义了符号常量PI,其值为3.1416。#include <stdio.h> #define PI 3.1415926 // 定义宏常量PI,表示圆周率 #define MAX_NUM 100 // 定义宏常量MAX_NUM,表示最大数值 int main() { double circle_area = PI * 5 * 5; // 在代码中使用PI,预处理时会替换为3.1415926 int num = MAX_NUM; // 使用MAX_NUM,会替换为100 printf("用#define定义的常量示例:圆面积 = %lf\n", circle_area); printf("最大数值示例: %d\n", num); return 0; }
- 使用const关键字:
const
是C语言中的关键字,用于声明常量。- 定义形式为:
const 数据类型 变量名 = 常量值
。 - 例如:
const int MAX_SIZE = 100
,定义了整型常量MAX_SIZE,其值为100。#include <stdio.h> int main() { const int num = 10; // 定义常变量num,初始值为10,后续不能修改其值 // num = 20; // 这行代码是错误的,试图修改常变量的值,编译会报错 printf("用const定义的常量示例: %d\n", num); return 0; }
总结
特性 | 变量 (Variables) | 常量 (Constants) |
---|---|---|
定义 | 用于存储数据的容器,可以在程序运行期间修改其值。 | 固定不变的值,在程序运行期间不能修改。 |
声明方式 | 使用数据类型声明,例如:int age; | 使用 const 关键字声明,例如:const int MAX_STUDENTS = 100; <br>使用 #define 预处理器指令声明,例如:#define PI 3.14159 |
数据类型 | 必须指定数据类型,例如:int , float , char 等。 | 可以指定数据类型(使用 const ),也可以不指定数据类型(使用 #define )。 |
作用域 | 可以有局部作用域(在函数或代码块内声明)和全局作用域(在所有函数之外声明)。 | 可以有局部作用域(在函数或代码块内声明)和全局作用域(在所有函数之外声明)。 |
生命周期 | 从声明开始,到其作用域结束。 | 从声明开始,到其作用域结束。 |
修改性 | 可以在程序运行期间修改其值。 | 一旦赋值,就不能再修改其值。 |
类型检查 | 编译器会进行类型检查,确保赋值和操作符合数据类型要求。 | 使用 const 定义的常量有数据类型,编译器会进行类型检查;使用 #define 定义的常量没有数据类型,只是简单的文本替换。 |
内存分配 | 占用内存空间,存储实际数据。 | 占用内存空间,存储实际数据。 |
示例 | c<br>int age = 25;<br>float height = 1.75;<br> | c<br>const int MAX_STUDENTS = 100;<br>const float PI = 3.14159;<br>#define MAX_AGE 120<br>#define PI 3.14159<br> |