在编写 C++ 程序时,无论是保存数据的变量和常量,还是后面要学习的函数和类,都需要有一个明确的名字,方便程序随时找到并使用它们。在 C++ 中,这些由我们自己定义的名字统称为 “标识符”。
C++ 标识符是什么?
初学的小伙伴可能会有一个疑问:“C++ 中的标识符到底是什么?它和前面说的变量名有什么区别呢?”
实际上,变量名只是变量的名字,而标识符(Identifier)是变量名、常量名、函数名、类名等各种自定义名称的统称。换句话说,标识符这个概念是包含变量名的。我们先来看两行熟悉的代码:
int bookCount = 5;
const int maxScore = 100;在这两行代码中,bookCount 是我们给变量起的名字,maxScore 是给常量起的名字,它们都属于标识符。等学到后面的章节,我们还会给函数、结构体、类以及命名空间起名字,它们也全都属于标识符的范畴。
C++ 标识符的命名规则
在 C++ 中,给标识符起名字并不是随心所欲的,只要违反了语法规则,程序就会直接编译报错。合法的标识符必须严格遵循以下 3 条规则:
- 只能由英文字母(a~z、A~Z)、数字(0~9)和下划线(_)组成,并且第一个字符必须是英文字母或下划线,不能以数字开头。
- 不能使用 C++ 关键字作为标识符。
- 严格区分英文字母的大小写。
其中 “不能使用关键字” 我们在上一节已经演示过了,下面结合具体示例,把另外两条规则和初学者容易踩坑的地方逐一弄清楚。
1. 字符组成与开头限制
按照第一条规则,标识符里面只能出现英文字母、数字和下划线(_)这 3 类字符,而且数字不能放在第一个字符的位置。
换句话说,名字里不能包含空格、连字符(-)、百分号(%)、星号(*)或井号(#)等其他符号。因为这些符号在 C++ 中都有专门的运算或语法用途,比如 - 表示减号、* 表示乘号,一旦写进名字里,编译器就会认错。常见的正误命名对比如下表所示。
| 标识符 | 是否正确 | 说明 |
|---|---|---|
| bookCount | √ | 由英文字母组成,符合规则 |
| unit_price | √ | 使用下划线连接单词,符合规则 |
| level2 | √ | 数字不在开头位置,符合规则 |
| 2level | × | 不能以数字开头 |
| unit-price | × | 不能包含连字符(-),应改用下划线 |
| total score | × | 中间不能包含空格 |
| class | × | 不能使用 C++ 关键字 |
示例 1:合法的标识符命名
#include <iostream>
int main() {
int price = 15;
int bookCount = 6;
int unit_price = 20;
int level2 = 90;
std::cout << bookCount << " " << level2;
return 0;
}运行结果如下。
6 90分析:
在这个例子中,price、bookCount、unit_price 以及 level2 全都符合命名规则,因此程序可以正常编译并输出结果。小伙伴们可以留意一下 level2:只要数字不是放在第一个字符的位置,写在中间或末尾都是完全合法的。
反过来,如果违反了字符组成限制,比如用数字开头,编译器就会直接报错。下面我们来看这个例子。
示例 2:以数字开头的非法命名
#include <iostream>
int main() {
int 2level = 90;
std::cout << 2level;
return 0;
}运行结果如下。
(报错)error: expected unqualified-id before numeric constant分析:
int 2level = 90; 尝试将变量名定义为 2level。由于它以数字 2 开头,违反了命名规则,编译器在数字常量前找不到合法的标识符名称,于是直接报错。
2. 严格区分大小写
在 C++ 中,标识符是严格区分大小写的。也就是说,只要有一个字母的大小写不同,在编译器眼里就是两个完全独立的名字。比如 score、Score 和 SCORE 就是 3 个不同的标识符。
示例 3:区分字母大小写
#include <iostream>
int main() {
int score = 60;
int Score = 90;
std::cout << score << " " << Score;
return 0;
}运行结果如下。
60 90分析:
score 的首字母是小写,而 Score 的首字母是大写,因此它们是两个完全不同的变量,分别保存了 60 和 90,输出时互不干扰。
不过在实际开发中,大家千万不要故意在同一段代码里定义两个只差字母大小写的变量,比如同时定义 count 和 Count,否则写代码时很容易看走眼。
C++ 标识符的命名规范
前面介绍的 “命名规则” 是语法规定的硬性底线,一旦写错就会编译报错。而在实际项目开发中,为了让写出来的代码直观好懂、方便维护,我们还需要养成良好的命名习惯,重点注意以下 2 点。
1. 见名知意
给变量、常量或函数起名字时,尽量选用有明确含义的英文单词,做到 “见名知意”,不要在正式项目里满篇写 a、b、c、x1、x2 这类模糊的名字:
// 不推荐
int a = 20;
int b = 95;
const int c = 100;
// 推荐
int studentAge = 20;
int mathScore = 95;
const int maxCount = 100;当然了,为了讲解语法方便,咱们这个教程在部分简单示例中,变量的命名可能会比较简短,比如使用 a、b、n。但在真正的项目开发中,养成见名知意的习惯非常重要。
2. 不要以下划线开头
虽然语法规则允许标识符以下划线(_)开头,比如写 int _value = 10; 也能通过编译,但在日常写代码时,我们自己定义的名称应该统一使用英文字母开头,不要以下划线开头。
这是因为在 C++ 标准中,像 _Value 这样下划线紧跟大写字母的名字,或者像 my__score 这样包含两个连续下划线的名字,都预留给了编译器和标准库内部自用。为避免潜在冲突,平时统一用英文字母开头,并且不要连写两个下划线:
// 不推荐
int _Value = 10;
int my__score = 95;
// 推荐
int value = 10;
int my_score = 95;C++ 标识符的命名风格
当一个变量名或常量名由多个英文单词组合而成时,由于单词之间不能留空格,实际开发中通常会采用以下 3 种主流命名风格:
小驼峰命名法(camelCase):第一个单词首字母小写,从第二个单词开始首字母大写,比如 studentAge、maxScore、totalCount,常用于普通变量名和函数名。
下划线命名法(snake_case):也叫蛇形命名法,所有单词均使用小写字母,单词之间用下划线(_)连接,比如 student_age、max_score、total_count,在 C++ 标准库与工程项目中同样非常常见。
全大写加下划线(UPPER_SNAKE_CASE):所有字母全部大写,单词之间用下划线(_)连接,比如 MAX_SCORE、MAX_COUNT,常用于需要醒目区分的常量。
对于普通变量来说,选用 “小驼峰命名法” 或 “下划线命名法” 都是可以的。最重要的是在同一个项目里保持前后风格一致,不要一会儿用小驼峰、一会儿又换成下划线。
