C++ 标识符

在编写 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,常用于需要醒目区分的常量。

对于普通变量来说,选用 “小驼峰命名法” 或 “下划线命名法” 都是可以的。最重要的是在同一个项目里保持前后风格一致,不要一会儿用小驼峰、一会儿又换成下划线。

上一篇:

下一篇:

给站长反馈

绿叶网正在不断完善中,小伙伴们如果发现任何问题,还望多多给站长反馈,谢谢!

邮箱:lvyenet@vip.qq.com

「绿叶网」服务号
绿叶网服务号放大
关注服务号,微信也能看教程。
绿叶网服务号