C 语言学习-02【编程习惯】

news2024/11/8 16:04:26

1、命名规则

  • 标识符的命名要清晰直观,有明确的含义

    fine:

    int error_number;
    int number_of_completed_connection
    

    awful:

    int n;
    int nerr;
    int n_comp_conns;
    
  • 标识符的长度应当符合“最短长度”和“最多信息”的原则

  • 程序中不要出现仅靠大小写区分的相似的标识符

    int x, X;
    void foo(int x);
    void FOO(float x);
    
  • 程序中不要出现标识符完全相同的局部变量和全局变量,尽管两者的作用域不同而不会发生语法错误,但会让人误解

  • 用正确的反义词组命名具有互斥意义的变量或相反动作的函数等

    int minValue;
    int maxValue;
    int SetValue(...);
    int GetValue(...);
    
  • 尽量避免名字中出现数字编号,处分逻辑上的确需要编号

    awful:

    #define EXAMPLE_)_TEST_
    #define EXAMPLE_!_TEST_
    

    fine:

    #define EXAMPLE_UNIT_TEST_
    #define EXAMPLE_ASSERT_TEST_
    
  • 变量和参数用小写字母开头的单词组合而成,常量全用大写的字母,用下划线分割单词

    BOOL flag;
    int drawMode;
    const int MAX = 100;
    const int MAX_LENGTH = 100;
    
  • 如果不得一需要全局变量,则是全局变量加前缀g_(表示 global)

    int g_howManyPeople;
    int g_howManyMoney;
    
  • 变量的名字应当使用“名词”或者“形容词 + 名词”

    float value;
    float oldValue;
    float newValue;
    
  • 函数命名应以函数要执行的动作命名,一般采用“动词”或者“动词 + 名词”的结构

    // 找到当前进程的当前目录
    DWORD GetCurrentDiretory(DWORD BufferLength, LPTSTR Buffer);
    
  • 对于数值或者字符串等常量的定义,建议采用全大写字母,且单词之间加下划线“_”的方式命名

    #define PI_ROUNDES 3.14
    

2、if 语句

  • 整型变量与 0 进行比较操作是,应当将整型变量用”==“或”!=”直接与 0 比较

    fine:

    if (value == 0);
    if (value != 0);
    

    awful:

    if (value);
    if (!value);
    
  • 不可将浮点变量用“==”或“!=”与任何数字比较,应该设法转化成“>=”或“<=”形式

    awful:

    if (x == 0.0);
    

    fine:

    if ((x >= - EPSINON) && (x <= EPSINON));
    // EPSINON 是允许的误差(即精度)
    
  • 判断一个指针变量是否为空时,应当将指针变量用”==“或”!=“与 NULL 比较

    if (p == NULL);
    if (p != NULL);
    

3、循环语句

  • 在多重循环中,如果有可能,应当将最长的循环放在最内层,最短的放在最外层,以减少 CPU 跨且循环层的次数
  • 如果循环体内存在逻辑判断,并且循环次数很大,宜将逻辑判断移到循环体外面

4、宏和常量

  • 使用宏定义表达式时,要使用完备的括号

    awful:

    #define RECTANGLE_AREA(a, b) a * b
    #define RECTANGLE_AREA(a, b) (a * b)
    #define RECTANGLE_AREA(a, b) (a) * (b)
    

    fine:

    #define RECTANGLE_AREA(a, b) ((a) * (b))
    

    better:

    #define FOO(x) do { \
    	printf("arg is %s\n", x); \
    	do_something_useful(x); \
    } while(0)
    
  • 使用宏时,不允许参数发生变化

5、参数的规则

  • 参数的书写要完整,如果函数没有参数,则用 void 填充

    void SetValue(int width, int height); // fine
    void SetValue(int, int); // awful
    float GetValue(void); // fine
    float GetValue(); // awful
    
  • 参数命名要恰当,顺序要合理

    awful:

    void StringCopy(char *str1, char *str2);
    

    fine:

    void StringCopy(char *strDestination, const char *strSource);
    

6、函数内部实现的规则

  • return 语句不可返回指向“栈内存”的“指针”,因为该内存在函数体结束时被自动销魂

    char *Func(void) {
        char str[] = "hello world";
        ...
        return str;
    }
    

7、断言的使用

内存复制函数:(如果 assert 的参数为假,那么程序就会终止,并出现提示对话,说明在某个地方引发了 assert)

void *memcpy(void *pvTo, const void *pvFrom, size_t size) {
    assert((pvTo != NULL) && (pvFrom != NULL)); // 使用 assert
    byte *pbTo = (byte*)pvTo; // 防止改变 pvTo 的地址
    byte *pbFrom = (byte*)pvFrom; // 防止改变 pvFrom 的地址
    while (size-- > 0) {
        *pvTo++ = *pbFrom++;
        return pvTo;
    }
}

8、内存管理

  • 用 malloc 申请内存之后,应该立即检查指针值是否为 NULL,防止使用指针值为 NULL 的内存
  • 不要忘记为数组和动态内存赋初值,防止将未被初始化的内存作为右值使用
  • 避免数组或指针的下标越界,特别要当心发生“多1”或者:少1“操作
  • 动态内存的申请与释放必须配对,防止内存泄露
  • 用 free 释放了内存之后,立即将指针设置为 NULL,防止产生”野指针“

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

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

相关文章

python操作MySQL以及SQL综合案例

1.基础使用 学习目标&#xff1a;掌握python执行SQL语句操作MySQL数据库软件 打开cmd下载安装 安装成功 connection就是一个类&#xff0c;conn类对象。 因为位置不知道&#xff0c;所以使用关键字传参。 表明我们可以正常连接到MySQL 演示、执行非查询性质的SQL语句 pytho…

【含开题报告+文档+源码】基于SSM的物流管理系统设计与实现

开题报告 随着电子商务的迅猛发展和人们生活水平的提高&#xff0c;快递服务行业正经历着前所未有的增长。占航快递公司作为国内知名的快递企业之一&#xff0c;面临着巨大的机遇和挑战。传统的快递服务管理方式已经无法满足日益增长的业务需求&#xff0c;快递服务流程中的问…

外包干了2年,快要废了。。。

先说一下自己的情况&#xff0c;普通本科毕业&#xff0c;在外包干了2年多的功能测试&#xff0c;这几年因为大环境不好&#xff0c;我整个人心惊胆战的&#xff0c;怕自己卷铺盖走人了&#xff0c;我感觉自己不能够在这样蹉跎下去了&#xff0c;长时间呆在一个舒适的环境真的会…

界面控件DevExpress WPF中文教程:Data Grid——卡片视图设置

DevExpress WPF拥有120个控件和库&#xff0c;将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpress WPF能创建有着强大互动功能的XAML基础应用程序&#xff0c;这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。 无论是Office办公软件…

使用Matlab神经网络工具箱

综述 在大数据和人工智能时代&#xff0c;深度学习是一种最为常见的数据分析和拟合工具。本报告以常用分析软件Matlab为例&#xff0c;介绍如何通过编写代码实现一个简单的CNN卷积神经网络。 Step 1: 打开matlab&#xff0c;新建脚本 1、安装matlab 2018以上版本后&#xff…

【系统设计——认证授权——基本概念知识】

1. 认证和授权的区别 Authentication&#xff08;认证&#xff09; 是验证您的身份的凭据&#xff08;例如用户名/用户 ID 和密码&#xff09;&#xff0c;通过这个凭据&#xff0c;系统得以知道你就是你&#xff0c;也就是说系统存在你这个用户。所以&#xff0c;Authenticat…

区块链技术入门:以太坊智能合约详解

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 区块链技术入门&#xff1a;以太坊智能合约详解 区块链技术入门&#xff1a;以太坊智能合约详解 区块链技术入门&#xff1a;以太…

【Spring】更加简单的将对象存入Spring中并使用

前言 本期讲解&#xff1a;通过Controller、Service、Repository、Component、Configurtion类注解、Bean方法注解&#xff0c;来更加简单的在Spring中存与读对象。 目录 1. 类注解 1.1 通过标签 1.2 使用类注解 1.3 什么是类注解 1.4 获取Bean对象命名问题 2. 方法注解 …

Vue(JavaScript)读取csv表格并求某一列之和(大浮点数处理: decimal.js)

文章目录 想要读这个表格&#xff0c;并且求第二列所有价格的和方法一&#xff1a;通过添加文件输入元素上传csv完整&#xff08;正确&#xff09;代码之前的错误部分因为价格是小数&#xff0c;所以下面的代码出错。如果把parseFloat改成parseInt&#xff0c;那么求和没有意义…

火山引擎云服务docker 安装

安装 Docker 登录云服务器。 执行以下命令&#xff0c;添加 yum 源。 yum update -y yum install epel-release -y yum clean all yum list依次执行以下命令&#xff0c;添加Docker CE镜像源。更多操作请参考Docker CE镜像。 # 安装必要的一些系统工具 sudo yum install -y yu…

人保财险(外包)面试分享

前言&#xff1a; 这是本月面的第三家公司&#xff0c;太难了兄弟们&#xff0c;外包都不好找了&#xff0c;临近年底&#xff0c;金九银十已经错过了&#xff0c;金三银四虽然存在&#xff0c;但按照这几年的行情&#xff0c;金九银十和金三银四其实已经是不复存在了&#xf…

【D3.js in Action 3 精译_039】4.3 D3 面积图的绘制方法及其边界标签的添加

当前内容所在位置&#xff1a; 第四章 直线、曲线与弧线的绘制 ✔️ 4.1 坐标轴的创建&#xff08;上篇&#xff09; 4.1.1 D3 中的边距约定&#xff08;中篇&#xff09;4.1.2 坐标轴的生成&#xff08;中篇&#xff09; 4.1.2.1 比例尺的声明&#xff08;中篇&#xff09;4.1…

美国大选——极具典型的可视化案例!GISer学起来

有人说可视化技术有啥意义&#xff0c;不就做个大屏么&#xff1f; 那真的小看了&#xff0c;就如下图这个美国大选来看&#xff0c;这么复杂混乱的信息&#xff0c;可视化技术给你梳理的明明白白的&#xff0c;简单、直观、形象、便于记忆。 让用户能够从繁杂信息中快速抓到重…

使用PyQt5设计一个简易计算器

目录 设计UI图 代码 结果展示 设计UI图 代码 from PyQt5 import QtCore, QtGui, QtWidgets from PyQt5.QtCore import * from PyQt5.QtGui import * from PyQt5.QtWidgets import QFileDialog, QMainWindow, QMessageBox from untitled import Ui_MainWindow import sysclass…

数据结构-数组(稀疏矩阵转置)和广义表

目录 1、数组定义 1&#xff09;数组存储地址计算示例①行优先②列优先 2&#xff09;稀疏矩阵的转置三元组顺序表结构定义 ①普通矩阵转置②三元组顺序表转置稀疏矩阵③稀疏矩阵的快速转置 3&#xff09;十字链表结构定义 2、广义表定义 1&#xff09;基本操作①GetHead②GetT…

cooladmin使用整理

1、后端关键字自动生成没有代码段提示&#xff0c;原因是拉取的项目代码中没有.vscode文件夹&#xff0c;复制一套至项目src同级即可 2、前端快速创建&#xff0c;在Entity完成后就去快速创建中选数据结构&#xff0c;这时没有对应的内容&#xff0c;数据结构是和controller层a…

Java 网络编程(一)—— UDP数据报套接字编程

概念 在网络编程中主要的对象有两个&#xff1a;客户端和服务器。客户端是提供请求的&#xff0c;归用户使用&#xff0c;发送的请求会被服务器接收&#xff0c;服务器根据请求做出响应&#xff0c;然后再将响应的数据包返回给客户端。 作为程序员&#xff0c;我们主要关心应…

Jmeter命令监控CPU等指标

JMeter 命令行执行脚本得到的报告中&#xff0c;是没有CPU、内存使用率等监控数据的&#xff0c;但是可以使用JMeter插件帮忙。 一、下载jmeter-plugins-manager.jar 下载后将文件放到jmeter安装包lib/ext目录下。打开Jmeter》菜单栏》选项》Plugins Manager 二、安装PerfMon…

ES + SkyWalking + Spring Boot:日志分析与服务监控(三)

目录 一、搭建SkyWalking 1.1 版本选择 1.2 下载安装 1.3 配置启动 1.4 SkyWalking UI介绍 二、Springboot项目使用 2.1 Agent下载 2.2 Agent配置skywalking oap地址 2.3 IDEA配置Agent地址 2.4 生成的ES索引介绍 三、在kibana上查看日志 四、问题和解决 3.1 日志…

如何快速搭建一个spring boot项目

一、准备工作 1.1 安装JDK&#xff1a;确保计算机上已安装Java Development Kit (JDK) 8或更高版本、并配置了环境变量 1.2 安装Maven&#xff1a;下载并安装Maven构建工具&#xff0c;这是Spring Boot官方推荐的构建工具。 1.3 安装代码编辑器&#xff1a;这里推荐使用Inte…