Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

变量与常量

一、基本概念

在 C++ 中,变量 (Variable) 是内存中的一块可命名的存储空间,用于保存数据值。 常量 (Constant) 则是在程序执行期间不能被修改的值。

变量与常量是程序存储数据和表达逻辑的基础。

二、变量 (Variable)

1. 定义变量

变量在使用前必须定义。定义时需指定类型,并可选地赋初值。

int age = 20;        // 定义并初始化一个整型变量
double weight;       // 定义一个浮点型变量,但未初始化
char grade = 'A';    // 定义并初始化一个字符型变量

建议始终初始化变量,避免使用未定义的值(否则可能产生未定义行为)。

2. 变量的命名规则

变量的命名要求符合一定的命名规则,具体可参考命名规则,可简要总结为:

  1. 只能包含字母、数字和下划线 _

  2. 不能以数字开头

  3. 区分大小写 (scoreScore 不同)

  4. 不能使用 C++ 关键字 (int, return 等)

  5. 应体现变量含义,例如:

    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