变量与常量
一、基本概念
在 C++ 中,变量 (Variable) 是内存中的一块可命名的存储空间,用于保存数据值。 常量 (Constant) 则是在程序执行期间不能被修改的值。
变量与常量是程序存储数据和表达逻辑的基础。
二、变量 (Variable)
1. 定义变量
变量在使用前必须定义。定义时需指定类型,并可选地赋初值。
int age = 20; // 定义并初始化一个整型变量
double weight; // 定义一个浮点型变量,但未初始化
char grade = 'A'; // 定义并初始化一个字符型变量
建议始终初始化变量,避免使用未定义的值(否则可能产生未定义行为)。
2. 变量的命名规则
变量的命名要求符合一定的命名规则,具体可参考命名规则,可简要总结为:
-
只能包含字母、数字和下划线
_ -
不能以数字开头
-
区分大小写 (
score与Score不同) -
不能使用 C++ 关键字 (
int,return等) -
应体现变量含义,例如:
int studentCount; // 好 int sc; // 不推荐
3. 变量的作用域与生命周期
(1)作用域 (Scope)
变量的可见范围取决于其定义位置:
| 类型 | 定义位置 | 可见范围 |
|---|---|---|
| 局部变量 | 函数或代码块内 | 仅在当前函数或块中可见 |
| 全局变量 | 所有函数外部 | 在整个文件中可见 |
int globalVar = 10; // 全局变量
void func() {
int localVar = 5; // 局部变量
}
(2)生命周期 (Lifetime)
- 局部变量:进入作用域时创建,离开作用域时销毁。
- 全局变量/静态变量:程序启动时创建,程序结束时销毁。
void counter() {
static int count = 0; // 静态局部变量,只初始化一次
count++;
std::cout << count << std::endl;
}
4. 变量的存储类型说明符
| 关键字 | 含义 |
|---|---|
auto | 自动类型推断(C++11 引入) |
register | 建议编译器将变量存储在寄存器中(已过时) |
static | 使局部变量在函数多次调用间保持值不变 |
extern | 引用外部定义的变量 |
mutable | 允许在 const 对象中修改该成员(仅类成员有效) |
extern int count; // 声明外部变量
auto x = 3.14; // 类型自动推断为 double
还有更多的变量修饰符,详见基本数据类型。
三、常量 (Constant)
1. 字面值常量 (Literal Constant)
直接出现在代码中的固定值:
123 // 整数常量
3.14 // 浮点常量
'a' // 字符常量
"Hello" // 字符串常量
true, false // 布尔常量
有时候会以宏定义的方式存在,例如
#define pi 3.14,在预处理阶段完成替换处理,本质上还是字面值常量。使用宏替换的方式,被替换的常量在编译出来的二进制中会重复存在,因此使用
constexpr会提高空间利用率。
2. const 常量
const 修饰的变量一旦初始化,其值不能被修改,因此const常量本质上是不可变化的变量:
const double PI = 3.14159;
PI = 3.14; // 错误:不能修改常量
常量指针与指向常量的指针
| 形式 | 含义 |
|---|---|
const int* p // 常量指针 | 指针指向的值不能改 |
int* const p // 指针常量 | 指针本身不能改 |
const int* const p | 值与指针均不可改 |
指针常量和常量指针各是什么,有什么区别?
指针常量和常量指针各是什么,有什么区别?
指针常量是指定义了一个指针,这个指针的值只能在定义时进行初始化,其他时候不能改变。
常量指针是指定义了一个指针,这个指针指向了一个只读的对象,不能通过常量指针来修改这个对象的值。
指针常量强调的是指针本身的不可改变性,而常量指针强调的是指针对其所指对象的不可改变性。
无论是指针常量还是常量指针,其最大的用途就是作为函数的形式参数,保证实参在被调用函数中的不可改变特性。
3. constexpr 常量表达式(C++11 起)
constexpr 表示在编译期即可确定值的常量。它比 const 更严格:
constexpr int max_size = 100;
constexpr int square(int x) { return x * x; }
int arr[square(4)]; // 编译期确定数组大小
const表示值不可改,而constexpr表示在编译时确定值。
4. 枚举常量 (Enumeration)
枚举用于定义一组命名的整型常量:
enum Color { RED, GREEN, BLUE };
Color c = GREEN;
自定义起始值:
enum ErrorCode { OK = 0, NotFound = 404, ServerError = 500 };
四、变量与常量的对比
| 特性 | 变量 | 常量 |
|---|---|---|
| 值是否可修改 | 可修改 | 不可修改 |
| 是否必须初始化 | 否(但推荐) | 是 |
| 存储位置 | 栈 / 堆 / 静态区 | 通常在只读区 |
| 示例 | int x = 5; | const int x = 5; |
五、示例代码
#include <iostream>
using namespace std;
constexpr double PI = 3.14159;
int main() {
int radius = 5;
const double area = PI * radius * radius;
cout << "半径:" << radius << endl;
cout << "圆面积:" << area << endl;
// area = 100; // 常量不可修改
return 0;
}
输出:
半径:5
圆面积:78.5397