第六十七天学习记录:对陈正冲编著《C 语言深度解剖》中关于变量命名规则的学习

news2024/12/26 22:40:27

最近开始在阅读陈正冲编著的《C 语言深度解剖》,还没读到十分之一就感觉收获颇多。其中印象比较深刻的是其中的变量的命名规则
里面提到的不允许使用拼音正是我有时候会犯的错。
因为在以往的工作中,偶尔会遇到时间紧迫的情况。
而对于新增加的变量不知道该用什么英文单词命名,为了赶时间,就用拼音代替。殊不知这是一个很不好的习惯。

一般规则:

**【规则 1-1】**命名应当直观且可以拼读,可望文知意,便于记忆和阅读。
标识符最好采用英文单词或其组合,不允许使用拼音。程序中的英文单词一般不要太复杂,用词应当准确。

这个很好理解,比如要用int整型定义一个矩形框的长,就用int width。

**【规则 1-2】**命名的长度应当符合“min-length && max-information”原则。C 是一种简洁的语言, 命名也应该是简洁的。例如变量名 MaxVal 就比MaxValueUntilOverflow 好用。标识符的长度一般不要过长,较长的单词可通过去掉“元音”形成缩写。另外,英文词尽量不缩写,特别是非常用专业名词,如果有缩写,在同一系统中对同一单词必须使用相同的表示法,并且注明其意思。
“min-length && max-information” 原则是指在信息传递的过程中,文本长度应该尽可能短,但是不能牺牲信息的准确性和完整性。这个原则体现了在信息传递中精简和有效的文本表达的重要性。
短文本可以更快地阅读和理解,同时也可以在有限的空间内更好地传达信息。然而,为了保证信息准确性和完整性,有时需要使用较长的文本。因此,在编写文本时,应该将准确和完整的信息作为首要考虑因素,并尽可能简洁明了地表达出来。
这个原则可以通过有效的排版、优化的语言和有意义的标题来实现。通过使用这种最小长度和最大信息的原则,可以提高信息传递的效率和效果,使文本更易读和理解。

**【规则 1-3】**当标识符由多个词组成时,每个词的第一个字母大写,其余全部小写。比如:int CurrentVal;这样的名字看起来比较清晰,远比一长串字符好得多。
这个规则其实各大语言本身系统语句都在遵循,比如Qt的setWindowFlags,GetSystemMetrics,在命名变量名的时候,即便是再忙也要花时间去规范命名。如果为了方便,短时间还好,时间一长,代码量一大,或者将源代码给同事看的时候,估计都是一头雾水。

**【规则 1-4】**尽量避免名字中出现数字编号,如 Value1,Value2 等,除非逻辑上的确需要编号。比如驱动开发时为管脚命名,非编号名字反而不好。初学者总是喜欢用带编号的变量名或函数名,这样子看上去很简单方便,但其实是一颗颗定时炸弹。这个习惯初学者一定要改过来。
对于这个规则,在才开始工作做的第一个软件时就犯过错,在使用Qt的时候在UI界面新增控件时,编辑器会根据当前UI上的情况自己给控件创建名称。比如拉3个按钮控件,若UI界面上已经有两个被默认命名的按钮控件名pushButton,pushButton_2,那么这3个控件将会被命名为pushButton_3,pushButton_4,pushButton_5。虽然在UI界面新拉控件的时候很爽,咔咔咔半天时间就能做好一个界面。但真正开始对每个控件写事件,写槽函数的时候就会反复的回到UI界面,看这个按钮当时是setText的什么名字。这个习惯在第二个软件时有所改变。但是基于软件的性质,还是难免会出现数字编号。比如第二个软件所涉及到的下位机有40个通道,每个通道需要对应一组控件,在对这一组控件命名时就得加上通道号。

【规则 1-5】对在多个文件之间共同使用的全局变量或函数要加范围限定符(建议使用模块名
(缩写)作为范围限定符)。(GUI_ ,etc)

这个用到的比较少,是因为在工作中本人不是很喜欢定义全局变量。一般喜欢通过定义一个类专门来储存需要全局使用的变量。然后在这个类的public中定义,在需要引用全局变量的头文件中include这个类就行。我现在还不确定这种方式的优劣,等到我开始系统性学习C++的时候会重点关注这些知识点。

标识符的命名规则:

**【规则 1-6】**标识符名分为两部分:规范标识符前缀(后缀) + 含义标识 。非全局变量可以
不用使用范围限定符前缀。

在这里插入图片描述

**【规则 1-7】**作用域前缀命名规则。

No.标识符类型作用域前缀
1Global Variableg
2File Static Variable(native)n
3Function Static Variablef
4Auto Variablea
5Global Functiong
6Static Functionn

**【规则 1-8】**数据类型前缀命名规则。

No.PrefixSuffixData TypeExampleRemark
1btbitBit btVariable;
2bbooleanboolean bVariable;
3ccharchar cVariable;
4iintint iVariable;
5sshort[int]short[int] sVariable;
6llong[int]long[int] lVariable;
7uunsigned[int]unsigned[int] uiVariable;
8ddoubledouble dVariable;
9ffloatfloat fVariable;
10ppointervoid *vpVariable;指针前缀
11vvoidvoid vVariable;
13stenumenum A stVariable;
14ststructstruct A stVariable;
15stunionunion A stVariable;
16fpfunction pointvoid(* fpGetModeFuncList_a[])( void )
17_aarray ofchar cVariable_a[TABLE_MAX];
18_st_psttypedefenum/struct/uniontypedef struct SM_EventOpt { unsigned char unsigned int char}SM_EventOpt_st,*SM_EventOpt_pst;当自定义结构数据类型时使用_st 后缀;当自定义结构数据类型为指针类型时使用_pst后缀;

**【规则 1-9】**含义标识命名规则,变量命名使用名词性词组,函数命名使用动词性词组。

No变量名目标词动词(的过去分词)状语目的地含义
1DataGotFromSDDataGotFromSD从 SD 中取得的数据
2DataDeletedFromSDDataDeletedFromSD从 SD 中删除的数据

变量含义标识符构成:目标词 + 动词(的过去分词)+ [状语]+[目的地];

No变量名目标词动词(的过去分词)状语目的地含义
1GetDataFromSDDataGetFromSD从 SD 中取得的数据
2DeleteDataFromSDDataDeleteFromSD从 SD 中删除的数据

函数含义标识符构成:动词(一般现时)+目标词+[状语]+[目的地];

**【规则 1-10】**程序中不得出现仅靠大小写区分的相似的标识符。
例如:int x, X; 变量 x 与 X 容易混淆
void foo(int x); 函数 foo 与 FOO 容易混淆
void FOO(float x);
这里还有一个要特别注意的就是 1(数字 1)和 l(小写字母 l)之间,0(数字 0)和 o
(小写字母 o)之间的区别。这两对真是很难区分的,我曾经的一个同事就被这个问题折腾
了一次。

**【规则 1-11】**一个函数名禁止被用于其它之处。

//例如:
#include "c_standards.h"
void foo(int p_1)
{
	int x = p_1;
}
void static_p(void)
{
	int foo = 1u;
}

**【规则 1-12】**所有宏定义、枚举常数、只读变量全用大写字母命名,用下划线分割单词。

例如:
const int MAX_LENGTH = 100; //这不是常量,而是一个只读变量,具体请往后看
#define FILE_PATH “/usr/tmp”

**【规则 1-13】**考虑到习惯性问题,局部变量中可采用通用的命名方式,仅限于 n、i、j 等作
为循环变量使用。

一定不要写出如下这样的代码:

int p;
char i;
int c;
char * a;

一般来说习惯上用 n,m,i,j,k 等表示 int 类型的变量;c,ch 等表示字符类型变量;a 等表
示数组;p 等表示指针。当然这仅仅是一般习惯,除了 i,j,k 等可以用来表示循环变量外,别
的字符变量名尽量不要使用。

**【规则 1-14】**定义变量的同时千万千万别忘了初始化。定义变量时编译器并不一定清空了
这块内存,它的值可能是无效的数据。

**【规则 1-15】**不同类型数据之间的运算要注意精度扩展问题,一般低精度数据将向高精度
数据扩展。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/618064.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

chatgpt赋能python:Python安装和打开教程

Python安装和打开教程 Python作为一种高效、灵活、易学易用的编程语言,越来越受到广大程序员的青睐,越来越多的人想要学习Python。在学习Python之前,首先要进行Python的安装和打开。那么,本篇文章将为您介绍如何安装和打开Python…

为什么需要 git 和 相关的小知识

为什么需要git和相关的小知识 先看一个实际需求,引出Git 问题: 公司五一活动计划 ● 先说一个最简单的情况,比如你做了公司五一活动计划书(如图) 解决方案: 版本管理工具(Git) 一句话: Git 是目前最流行的分布式版本控制软件 Git 是怎么来的? Git…

读数据压缩入门笔记04_统计编码

1. 统计编码(statistical encoders)的算法 1.1. 每种编码方法都对每个符号的概率分布做了不同的假定 1.2. 需要处理的数据集中符号的概率分布与现有的VLC方法都不能完全匹配 1.3. 统计编码算法通过数据集中符号出现的概率来进行编码使结果尽可能与熵接…

【音视频开发】FFmpeg转换与封装 I - MP4格式

1 FFmpeg转换与封装 1.1 MP4格式转换 1.1.1 MP4格式标准 1 FFmpeg转换与封装 FFmpeg支持的媒体封装格式具有多样性与全面性,与此,我们还可以使用FFmpeg来对媒体格式进行转换与封装。 1.1 MP4格式转换 在互联网常见的格式中,跨平台最好的应…

【Vue】二:Vue核心处理---vue的其它指令和自定义指令

文章目录 1.vue的其它指令1.1v-text 和 v-html1.2 v-cloak1.3 v-once1.4 v-pre 2. 自定义指令2.1 函数式2.2 对象式2.3.定义全局的指令 1.vue的其它指令 1.1v-text 和 v-html v-text:当做文件解析。 v-html:当做 HTML 代码解析。 1.2 v-cloak v-cloa…

chatgpt赋能python:Python字典通过键找值:什么是Python字典?

Python字典通过键找值:什么是Python字典? Python字典是一种非常有用的数据类型,可以通过键值对方式存储和访问数据。它是Python的一种内置数据类型,可以在编程中非常方便地存储和操作数据。 Python字典可以存储任意类型的数据&a…

图书馆智能照明控制系统设计介绍 安科瑞 许敏

摘 要:简要介绍了一种新型的智能照明控制系统,论述了其系统特点和系统组成;结合该系统对某高校图书馆进行了照明节能设计。工程应用表明,该系统在公 共建筑节能中效果显著。 关键词:高校;图书馆&#xff…

【SpinalHDL快速入门】5.1、SpinalHDL组织结构之Component和hierarchy

文章目录 1.1、简介1.2、Input / output 定义1.3、修剪信号(Pruned signals)1.4、参数化硬件(在Verilog中称为“Parameter”)1.5、合成组件名称 1.1、简介 就像在 VHDL 和 Verilog 中一样,可以定义组件以用于构建设计…

Tableau招聘信息数据可视化

获取的招聘信息数据为某招聘网站发布的大数据及数据分析相关岗位,对其他计算机相关岗位的招聘信息数据分析也有一定的参考价值。因为所获取的招聘信息数据数量只有1万左右,实际的招聘信息数量肯定不止1万,所以可能会与实际信息有一定的误差。…

chatgpt赋能python:Python安装Gurobi优化器详细步骤

Python安装Gurobi优化器详细步骤 如果你是一个数据科学家或者运筹学专业的研究者,你肯定会经常接触到优化问题。Gurobi是一个流行的线性与整数规划优化软件包,它提供了出色的线性规划和整数规划支持,速度快,准确度高,…

nginx(八十三)error_page、proxy_intercept_errors深究

一 error_page和proxy_intercept_errors深究 强调: 本文只是基于状态码的角度来讨论error_page、proxy_intercept_errors差异性题外话: 让别人定位,一定要保留好事故现场,尽可能的提供更多的有用信息核心: 本文只讨论错误状态码的异常处理遗…

信息系统设计与分析

系统分析师作用 1. 业务需求 现有组织结构、组织目标、管理模式 部门业务、业务流程、业务规则 业务数据、业务过程与业务管理直接关系 业务优化与业务再造要求 2. 用户需求分析 新系统改进业务要求 对新系统的愿景与期望 对新系统使用要求 3. 系统需求分析 系统应具有哪些功能…

【JavaSE】Java(五十三):核心要点总结

文章目录 1. 简要说下什么是反射2. 什么是java序列化,什么情况下需要序列化3. 为什么需要克隆,如何实现克隆,深拷贝和浅拷贝区别4. throw 和 throws 区别5. final、finaly、finalize 区别 1. 简要说下什么是反射 Java反射是指在运行时获取类信…

chatgpt赋能python:Python安装dialog介绍

Python安装dialog介绍 Dialog是一个命令行工具,可以帮助用户在Linux系统中创建自定义对话框。它可以与多种编程语言一起使用,其中包括Python。在本文中,我们将详细介绍如何在Python中安装Dialog。 安装Dialog前的准备工作 在安装Dialog之前…

Git 命令行提交代码详细操作

Git 命令行提交代码操作(安装git后,鼠标右键打开Git Bash) 1、查看本地git绑定的用户名和邮箱: git config user.name git config user.email 2、① 修改本地git绑定的用户名和邮箱(全局): git config --global user.name “Your_userName” …

案例28:基于Springboot毕业设计系统开题报告设计

博主介绍:✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专…

视频直播播放器弹幕功能API

POLYV播放器拥有弹幕功能,可以增加观看视频时的互动性。 功能API 参数 参数名类型默认值说明danmuEnablebooleanfalse是否开启弹幕功能showDanmubooleantrue开启弹幕功能后,弹幕初始显示状态。false则一开始不显示弹幕。banDanmuBtnbooleanfalse为true时…

【Vue】三:Vue组件: 组件使用和组件嵌套

文章目录 1.第一个组件1.1不使用组件前1.2创建组件1.3注册组件1.4使用组件1.5 细节 2.组件嵌套 1.第一个组件 1.1不使用组件前 1.2创建组件 Vue.extends({该配置项和new Vue的配置项几乎相同})区别: (1)创建Vue组件的时候,不能使…

MySQL 查询分析

一个低效查询引发的思考 上次在做银行对账,上传对账单后,出现对账超时的情况。查看日志发现,最后一条日志记录停在了对 c2c_zwdb.t_file_count 的查询 sql 上。使用 show processlist 命令来查看当前 SQL 的执行情况,如下&#x…

说说验证码功能的实现

前言 大家好,我是 god23bin,今天说说验证码功能的实现,相信大家都经常接触到验证码的,毕竟平时上网也能遇到各种验证码,需要我们输入验证码进行验证我们是人类,而不是机器人。 验证码有多种类型&#xff…