当前位置: 首页 > 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…...

大数据学习栈记——Neo4j的安装与使用

本文介绍图数据库Neofj的安装与使用&#xff0c;操作系统&#xff1a;Ubuntu24.04&#xff0c;Neofj版本&#xff1a;2025.04.0。 Apt安装 Neofj可以进行官网安装&#xff1a;Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...

DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径

目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...

基于ASP.NET+ SQL Server实现(Web)医院信息管理系统

医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上&#xff0c;开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识&#xff0c;在 vs 2017 平台上&#xff0c;进行 ASP.NET 应用程序和简易网站的开发&#xff1b;初步熟悉开发一…...

解锁数据库简洁之道:FastAPI与SQLModel实战指南

在构建现代Web应用程序时&#xff0c;与数据库的交互无疑是核心环节。虽然传统的数据库操作方式&#xff08;如直接编写SQL语句与psycopg2交互&#xff09;赋予了我们精细的控制权&#xff0c;但在面对日益复杂的业务逻辑和快速迭代的需求时&#xff0c;这种方式的开发效率和可…...

【解密LSTM、GRU如何解决传统RNN梯度消失问题】

解密LSTM与GRU&#xff1a;如何让RNN变得更聪明&#xff1f; 在深度学习的世界里&#xff0c;循环神经网络&#xff08;RNN&#xff09;以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而&#xff0c;传统RNN存在的一个严重问题——梯度消失&#…...

第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明

AI 领域的快速发展正在催生一个新时代&#xff0c;智能代理&#xff08;agents&#xff09;不再是孤立的个体&#xff0c;而是能够像一个数字团队一样协作。然而&#xff0c;当前 AI 生态系统的碎片化阻碍了这一愿景的实现&#xff0c;导致了“AI 巴别塔问题”——不同代理之间…...

【分享】推荐一些办公小工具

1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由&#xff1a;大部分的转换软件需要收费&#xff0c;要么功能不齐全&#xff0c;而开会员又用不了几次浪费钱&#xff0c;借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...

FFmpeg:Windows系统小白安装及其使用

一、安装 1.访问官网 Download FFmpeg 2.点击版本目录 3.选择版本点击安装 注意这里选择的是【release buids】&#xff0c;注意左上角标题 例如我安装在目录 F:\FFmpeg 4.解压 5.添加环境变量 把你解压后的bin目录&#xff08;即exe所在文件夹&#xff09;加入系统变量…...

R 语言科研绘图第 55 期 --- 网络图-聚类

在发表科研论文的过程中&#xff0c;科研绘图是必不可少的&#xff0c;一张好看的图形会是文章很大的加分项。 为了便于使用&#xff0c;本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中&#xff0c;获取方式&#xff1a; R 语言科研绘图模板 --- sciRplothttps://mp.…...