当前位置: 首页 > news >正文

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

最近开始在阅读陈正冲编著的《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】**不同类型数据之间的运算要注意精度扩展问题,一般低精度数据将向高精度
数据扩展。

相关文章:

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

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

matlab 计算点云的线性指数

目录 一、算法原理二、代码实现三、结果展示一、算法原理 选取当前点 p i ( x , y , z ) p_{i}(x,y,z) p<...

SpringBoot集成ElasticSearch

文章目录 前言一、ElasticSearch本地环境搭建二、SpringBoot整合ElasticSearch1.pom中引入ES依赖2.application.yaml配置elasticsearch3.ElasticSearchClientConnect连接ES客户端工具类4.ElasticSearchResult封装响应结果5.Person实体类6.Person实体类7.ElasticsearchControlle…...

分治入门+例题

目录 &#x1f947;2.3.2 合并排序 &#x1f947;2.3.3 快速排序 &#x1f33c;P1010 [NOIP1998 普及组] 幂次方 &#x1f333;总结 形象点&#xff0c;分治正如“凡治众如治寡&#xff0c;分数是也”&#xff0c;管理少数几个人&#xff0c;即可统领全军 本质&#xff…...

剑指offer打卡

这里写目录标题 day1 二叉树和为某一路径day2复杂链表的复刻day3二叉搜索树与双向链表day4数字排列day5找出出现次数超过一半的次数day6 二进制中1的个数day7 二叉树的最近公共祖先day8 字符串转换为整数day9 构建乘积数组day10不用加减乘除的加法day11求12....nday11 股票的最…...

运维实用脚本整理

运维实用脚本整理 本文脚本仅供参考运维排查问题思路运维排查问题的方法和命令&#xff08;1&#xff09;尽可能搞清楚问题的前因后果&#xff08;2&#xff09;有谁在?&#xff08;3&#xff09;之前发生了什么?&#xff08;4&#xff09; 现在在运行的进程是啥?&#xff0…...

INT8 中的稀疏性:加速的训练工作流程和NVIDIA TensorRT 最佳实践

INT8 中的稀疏性&#xff1a;加速的训练工作流程和NVIDIA TensorRT 最佳实践 文章目录 INT8 中的稀疏性&#xff1a;加速的训练工作流程和NVIDIA TensorRT 最佳实践结构稀疏量化在 TensorRT 中部署稀疏量化模型的工作流程案例研究&#xff1a;ResNet-34要求第 1 步&#xff1a;…...

隧道模式HTTP代理使用代码示例

以下是使用Python实现隧道模式HTTP代理的代码示例&#xff1a; python import socket def handle_client(client_socket): # 接收客户端请求 request client_socket.recv(4096) # 解析请求头&#xff0c;获取目标主机和端口号 host request.split(b\r\n)[1].sp…...

翻筋斗觅食海鸥优化算法-附代码

翻筋斗觅食海鸥优化算法 文章目录 翻筋斗觅食海鸥优化算法1.海鸥优化算法2. 改进海鸥优化算法2.1 非线性参数 &#xff21; 策略2.2 翻筋斗觅食策略 3.实验结果4.参考文献5.Matlab代码6.python代码 摘要&#xff1a;针对基本海鸥优化算法(SOA)在处理复杂优化问题中存在低精度、…...

K8S常见应用场景(六)

Kubernetes 是一个可移植的、可扩展的开源平台&#xff0c;用于管理容器化的工作负载和服务&#xff0c;可促进声明式配置和自动化。 Kubernetes 拥有一个庞大且快速增长的生态系统。Kubernetes 的服务、支持和工具广泛可用。 Kubernetes 这个名字源于希腊语&#xff0c;意为“…...

《不抱怨的世界》随记

*不抱怨的世界 * 1.天才只有三件事&#xff1a;我的事&#xff0c;他的事&#xff0c;老天的事。抱怨自己的的人&#xff0c;应该试着学习接纳自己&#xff1b;抱怨他人的人&#xff0c;应该试着把抱怨转成请求&#xff1b;抱怨老天的人么&#xff0c;请试着用祈祷的方式来诉求…...

2.2 利用MyBatis实现CRUD操作

一、准备工作 打开MyBatisDemo项目 二、查询表记录 1、在映射器配置文件里引入结果映射元素 在UserMapper.xml文件里创建结果映射元素 将UserMapper接口里抽象方法上的注解暂时注释掉 运行TestUserMapper测试类里的testFindAll()测试方法&#xff0c;查看结果 2、添加…...

自动缩放Kubernetes上的Kinesis Data Streams应用程序

想要学习如何在Kubernetes上自动缩放您的Kinesis Data Streams消费者应用程序&#xff0c;以便节省成本并提高资源效率吗&#xff1f;本文提供了一个逐步指南&#xff0c;教您如何实现这一目标。 通过利用Kubernetes对Kinesis消费者应用程序进行自动缩放&#xff0c;您可以从其…...

介绍js各种事件

目录 一、点击事件 二、鼠标移动事件 三、键盘事件 四、滚轮事件 五、拖放事件 六、窗口大小改变事件 一、点击事件 点击事件是指当用户单击页面上的某个元素时触发的事件。这是最常见和基础的事件之一&#xff0c;也是Web应用程序中最常用的交互之一。 以下是如何使用…...

Python 将 CSV 分割成多个文件

文章目录 使用 Pandas 在 Python 中创建 CSV 文件在 Python 中将 CSV 文件拆分为多个文件根据行拆分 CSV 文件根据列拆分 CSV 文件 总结 在本文中&#xff0c;我们将学习如何在 Python 中将一个 CSV 文件拆分为多个文件。 我们将使用 Pandas 创建一个 CSV 文件并将其拆分为多个…...

S32K144开发板

目录 一&#xff0e;S32K144开发板概述 二&#xff0e;产品技术和功能规格 三&#xff0e;开发环境 1.S32K144的开发环境主流是这么三种&#xff1a; 2.开发板Demo工程 四&#xff0e;S32K144开发板实物图 五、汽车大灯硬件架构 一&#xff0e;S32K144开发板概述 S32K14…...

三波混频下的相位失配原理

原理推导 在四波混频情况下&#xff0c;实现零相位失配是一件很困难的事情。因为在四波混频中&#xff0c;相位调制和增益都依赖于相同的参数&#xff0c;即克尔非线性 γ \gamma γ。这个问题可以用嵌入在传输线上的辅助共振元件的复杂色散工程来部分解决。 但是在三波混频中…...

软考A计划-试题模拟含答案解析-卷一

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例 &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分享&am…...

Ubuntu下编译运行MicroPython Unix版本

文章目录 github拉取源码更新模块编译运行 github拉取源码 到Github(https://github.com/micropython/micropython)上下载源码 终端输入&#xff0c;如果提示识别不到gh命令&#xff0c;就sudo apt-get install gc安装一下。 再根据提示在终端里登录自己的github账号。 再次…...

实现用QCustomPlot封装的插件,放到绘图软件中可以点击和移动

首先,我们需要在绘图软件中创建一个插件,并将QCustomPlot控件添加到插件中。QCustomPlot是一个功能强大的绘图控件,可以轻松创建各种类型的图表,包括折线图、散点图、柱状图等等。 接下来,我们需要为QCustomPlot控件添加鼠标事件处理函数,以实现点击和移动的功能。QCust…...

RestClient

什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端&#xff0c;它允许HTTP与Elasticsearch 集群通信&#xff0c;而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级&#xff…...

MPNet:旋转机械轻量化故障诊断模型详解python代码复现

目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...

微信小程序之bind和catch

这两个呢&#xff0c;都是绑定事件用的&#xff0c;具体使用有些小区别。 官方文档&#xff1a; 事件冒泡处理不同 bind&#xff1a;绑定的事件会向上冒泡&#xff0c;即触发当前组件的事件后&#xff0c;还会继续触发父组件的相同事件。例如&#xff0c;有一个子视图绑定了b…...

UDP(Echoserver)

网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法&#xff1a;netstat [选项] 功能&#xff1a;查看网络状态 常用选项&#xff1a; n 拒绝显示别名&#…...

【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表

1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...

Spring Boot面试题精选汇总

&#x1f91f;致敬读者 &#x1f7e9;感谢阅读&#x1f7e6;笑口常开&#x1f7ea;生日快乐⬛早点睡觉 &#x1f4d8;博主相关 &#x1f7e7;博主信息&#x1f7e8;博客首页&#x1f7eb;专栏推荐&#x1f7e5;活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...

css的定位(position)详解:相对定位 绝对定位 固定定位

在 CSS 中&#xff0c;元素的定位通过 position 属性控制&#xff0c;共有 5 种定位模式&#xff1a;static&#xff08;静态定位&#xff09;、relative&#xff08;相对定位&#xff09;、absolute&#xff08;绝对定位&#xff09;、fixed&#xff08;固定定位&#xff09;和…...

2025盘古石杯决赛【手机取证】

前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来&#xff0c;实在找不到&#xff0c;希望有大佬教一下我。 还有就会议时间&#xff0c;我感觉不是图片时间&#xff0c;因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...

uniapp手机号一键登录保姆级教程(包含前端和后端)

目录 前置条件创建uniapp项目并关联uniClound云空间开启一键登录模块并开通一键登录服务编写云函数并上传部署获取手机号流程(第一种) 前端直接调用云函数获取手机号&#xff08;第三种&#xff09;后台调用云函数获取手机号 错误码常见问题 前置条件 手机安装有sim卡手机开启…...

uniapp 开发ios, xcode 提交app store connect 和 testflight内测

uniapp 中配置 配置manifest 文档&#xff1a;manifest.json 应用配置 | uni-app官网 hbuilderx中本地打包 下载IOS最新SDK 开发环境 | uni小程序SDK hbulderx 版本号&#xff1a;4.66 对应的sdk版本 4.66 两者必须一致 本地打包的资源导入到SDK 导入资源 | uni小程序SDK …...