c 语言用户标识符的定义法则,就是程序员自己命名变量函数数组结构体标签等名称时必须遵守的语法规则,用户标识符是和关键字相对的概念,关键字是 c 语言本身保留的固定单词,不能拿来当用户标识符,编译器在编译的时候会依靠这套法则识别合法名称,如果命名违反法则,编译阶段直接报错,这套法则不只是字符组成限制,还包含大小写区分不能数字开头不能和关键字冲突等要点,同时行业还会附加编码规范,区分语法强制规则和推荐规范,很多考试和编程题经常考察 c 语言用户标识符的定义法则,核心考点就是判断一个字符串能不能作为合法用户标识符。
基础强制法则
第一 组成字符只能是英文字母大小写,数字,下划线,不能使用空格中文加减号等其他特殊符号。
第二 第一个字符必须是字母或者下划线,不允许数字作为开头。
第三 c 语言区分大小写,大写字母和小写字母视为不同的用户标识符,比如 Sum 和 sum 是两个独立名称。
第四 不能使用 c 语言关键字作为用户标识符,关键字是编译器预留单词,比如 int if for while return 这些,不能拿来命名变量或者函数。
第五 同一作用域内用户标识符不能重名,重名会出现重复定义编译错误。
关键字简要说明
c 语言标准关键字数量固定,全部都是小写,具备特殊语法含义,是编译器识别语法的专用单词,编写用户标识符的时候只要和关键字完全一致就判定非法,但是如果只是包含关键字字母组合,比如 integer 里面含有 int,这种不属于冲突,仍然是合法用户标识符。
合法与非法示例对照表
| 名称 | 是否合法 | 原因 |
|---|---|---|
| num | 合法 | 字母开头,只包含字母 |
| _score | 合法 | 下划线开头,符合起始字符要求 |
| a123 | 合法 | 字母开头,后面可以跟数字 |
| 123abc | 非法 | 数字开头,违反起始字符法则 |
| int | 非法 | 属于 c 语言关键字,不能作为用户标识符 |
| a-b | 非法 | 含有减号特殊符号,字符不允许 |
| sum total | 非法 | 中间存在空格,字符不允许 |
| Int | 合法 | 首字母大写,和关键字 int 不是同一个标识符 |
补充深度要点
第一 标识符长度,早期老标准规定有效识别长度有限,现代主流编译器支持很长的用户标识符,但是工程上不建议写过长名称,可读性会下降。
第二 作用域规则,不同作用域可以使用同名用户标识符,比如全局变量和局部变量同名,局部会遮蔽全局,语法本身允许,但是属于容易混淆写法,编码规范一般不推荐。
第三 预定义标识符,比如 printf scanf,这类属于库函数名称,虽然不属于关键字,语法上可以拿来做用户标识符,但是强烈不建议,会覆盖库函数,造成后续调用异常,考试题目经常把预定义标识符和关键字区分开。
第四 驼峰命名下划线命名属于推荐编码风格,不属于 c 语言用户标识符的定义强制法则,即使命名风格不规范,只要满足强制法则,编译器依旧可以正常编译。
综合来说,c 语言用户标识符的定义法则核心就是三种合法字符,首字符不能是数字,区分大小写,禁止占用关键字,掌握这套法则之后,可以快速判断任意名称是否能够作为变量函数名称,同时区分语法硬性规则和团队编码风格要求。
【常见问题】
问题 1 c 语言用户标识符的定义法则里能不能使用中文命名
回答 1 c 语言用户标识符的定义法则不支持中文作为合法字符,标准 c 语言用户标识符只能使用英文字母数字下划线,中文会触发编译错误,不能作为 c 语言用户标识符。
问题 2 c 语言用户标识符的定义法则是否区分大小写
回答 2 c 语言用户标识符的定义法则明确区分大小写,大写和小写字母属于不同字符,所以 Sum sum SUM 是三个独立 c 语言用户标识符,这是 c 语言用户标识符的定义法则重点考点。
问题 3 c 语言用户标识符的定义法则里预定义标识符可以使用吗
回答 3 c 语言用户标识符的定义法则没有禁止预定义标识符,语法层面可以使用,但是 c 语言用户标识符如果覆盖 printf 这类库函数名称,会破坏原有库函数调用,属于不推荐写法。
【免责申明】
本文内容仅作为 c 语言编程基础知识科普,不同 c 标准版本以及编译器对扩展命名特性支持存在细微差异,实际开发请参考对应标准与编译器官方文档,本文不构成工程开发方案推荐。


