侵权投诉

C语言/C++基本语句编程风格

玩转单片机 2020-08-05 11:03 次阅读

初学者阶段编程时,编写基本语句可能会有隐含错误的方式,基本语句主要针对if、for、while、goto、switch等,它们看似简单,但使用时隐患比较多,本文归纳了使用语句的一些规则和建议。

基本语句编程举例

if语句

if语句是C++++/C语言中最简单、最常用的语句,然而很多编程人员用隐含错误的方式写if语句,本文以“与零值比较”为例,进行讨论。

(1)布尔变量与零值比较:不可将布尔变量直接与TRUE、FALSE或者1、0比较。根据布尔类型的语义,零值为“假”(记为FALSE),任何非零值都是“真”(记为TRUE)。TRUE的值究竟是什么并没有统一的标准,

例如VC++将TRUE定义为1,而VB则将TRUE定义为-1。

假设布尔变量名为flag,它与零值比较的标准if语句如下

if(flag)//表示flag为真 if(!flag) //表示flag为假

其他的用法都属于不良风格,例如:

if(flag == TRUE) if(flag == FALSE) if(flag == 1 ) if(flag == 0 )

(2)整型变量与零值比较:应当将整型变量用“==”或“!=”直接与0比较。假设整型变量的名字为value,它与零值比较的标准if语句如下:

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

不可以模仿布尔变量的风格而写成:

if(value) if(!value) //会让人误解value是布尔变量

(3)浮点变量与零值比较:不可以将浮点变量用“==”或“!=”与任何数字比较。

千万留意,无论是float还是double类型的变量,都有精度限制,所以一定要避免将浮点变量用“==”或“!=”与数字比较,应该设法转化成“>=”或“<=”形式。假设浮点变量的名字为x,应该将

if(x == 0.0) //隐含错误的比较

转化为

if((x >= -EPSINON) && (x <= EPSINON)) //其中EPSINON是允许的误差(即精度)。

(4)指针变量与零值比较:应当将指针变量用“==”或“!=”与NULL比较。

指针变量的零值是“空”(记NULL)。尽管NULL的值与0相同,但二者的意义不同。假设指针变量名p,它与零值比较的标准if语句如下:

if(p == NULL) if(p != NULL) //p与NULL显式比较,强调p是指针变量

不要写成:

if(p == 0) if(p != 0) //容易让人误解p是整型变量

或者

if(p) if(!p) //容易让人误解p是布尔变量

(5)对if语句的补充说明

有时候可能会看到if(NULL == p)这样古怪的格式。这样写能够防止将if(p == NULL)误写成if(p = NULL),而有意将p和NULL颠倒。编译器认为if(p = NULL)是合法的,但会指出if(NULL = p)是错误的,因为NULL不能被赋值。程序中有时会遇到if/else/return的组合,应该将如下不良风格的程序:

if(condition) return x; return y;

改写成

if(condition) { return x; } else { return y; }

或者改成更加简练的:

return(condition ?x:y);

循环语句的效率

C++/C循环语句中,for语句使用频率最高,while语句其次,do语句很少用。提高循环体效率的基本方法是降低循环体的复杂性。

(1)在多重循环中,如果有可能,应当将最长的循环放在最内层,最短的循环放在最外层,以减少CPU跨切循环层的次数。例如下面代码示例b的效率就比示例a的高。

示例a:低效率(长循环在最外层)

for(row = 0; row < 100; row++) { for(col=0;col<5;col++) { sum = sum +a[row][col]; } }

示例b:高效率(长循环在最内层)

for(col = 0; col < 5; col++) { for(row=0;row<100;row++) { sum = sum +a[row][col]; } }

(2)如果循环体内存在逻辑判断,并且循环次数很大,宜将逻辑判断移到循环体的外面。

示例c的程序比示例d多执行了 N-1 次逻辑判断。并且由于前者老要进行逻辑判断,打断了循环“流水线”作业,使得编译器不能对循环进行优化处理,降低了效率。如果 N 非常大,最好采用示例 d的写法,可以提高效率。如果 N 非常小,两者效率差别并不明显,采用示例 c的写法比较好,因为程序更加简洁。

示例c:效率低但程序简洁

for(i = 0; i < N; i++) { if(condition) DoSomthing(); else DoSomthing(); }

示例d:效率高但程序不简洁

if (condition) { for (i=0; i

(3)for语句的循环控制变量

不可以在for循环体内修改循环变量,防止for循环失去控制。

建议for语句的循环控制变量的取值采用“半开半闭区间”写法。

示例e中的x值属于半开半闭区间“0=

示例e:循环变量属于半开半闭区间

for(int x = 0;x < N; x++) { }

示例f:循环变量属于闭区间

for(int x = 0;x <= N-1; x++) { }

switch语句switch是多分支选择语句,而if语句只有两个分支可供选择。虽然可以用嵌套的if语句来实现多分支选择,但那样的程序冗长难读。switch 语句基本格式:

switch(variable) { case value1: break; case value2: break; default: break; }

每个 case 语句的结尾不要忘了加 break,否则将导致多个分支重叠(除非有意使多个分支重叠)。不要忘记最后那个 default 分支,即使程序真的不需要 default 处理,也应该保留语句 default : break; 这样做并非多此一举,而是为了防止别人误以为你忘了 default 处理。

goto语句

自从提倡结构化设计以来,goto 就成了有争议的语句。

由于 goto 语句可以灵活跳转,如果不加限制,它的确会破坏结构化设计风格。

goto 语句经常带来错误或隐患。它可能跳过了某些对象的构造、变量的初始化、重要的计算等语句,

例如:

goto state; String s1, s2; // 被 goto 跳过 int sum = 0; // 被 goto 跳过 state:

如果编译器不能发觉此类错误,每用一次 goto 语句都可能留下隐患。很多人建议废除 C++/C 的 goto 语句,以绝后患。

但实事求是地说,错误是程序员自己造成的,不是 goto 的过错。goto 语句至少有一处可显神通,它能从多重循环体中一下子跳到外面,用不着写很多次的 break 语句;例如:

{ { { goto error; } } } error:

就像楼房着火了,来不及从楼梯一级一级往下走,可从窗口跳出火坑,所以我们主张少用、慎用 goto 语句,而不是禁用。

小结

主要针对if、for、while、goto、switch等基本语句使用时可能出现隐患问题,归纳了正确使用它们的一些规则和建议。

原文标题:C语言/C++基本语句编程风格

文章出处:【微信号:mcu168,微信公众号:玩转单片机】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
分享:

评论

相关推荐

疯壳-MTK智能穿戴入门篇-编程之资源

目录一、MTK开发环境搭建        3二、MTK平台框架        ...
发表于 09-29 15:59 0次 阅读
疯壳-MTK智能穿戴入门篇-编程之资源

疯壳-MTK智能穿戴入门篇-MKT之编程入门

目录一、MTK开发环境搭建        3二、MTK平台框架        ...
发表于 09-29 15:49 0次 阅读
疯壳-MTK智能穿戴入门篇-MKT之编程入门

让机器学习更容易的14种自由开源软件工具

通过一些易于实现的多样化库和框架能够充分挖掘机器学习的预测能力。垃圾邮件过滤,面部识别,推荐引擎等等....
的头像 如意 发表于 09-29 15:00 61次 阅读
让机器学习更容易的14种自由开源软件工具

许多C++开发人员则希望C语言灰飞烟灭?!

70年代初,贝尔实验室创建了C语言,它是开发UNIX的副产品。很快C就成为了最受欢迎的编程语言之一。....
的头像 嵌入式ARM 发表于 09-29 14:42 36次 阅读
许多C++开发人员则希望C语言灰飞烟灭?!

C语言中的短路现象

短路现象1 比如有以下表达式 abc 只有a为真(非0)才需要判断b的值;只有a和b都为真,才需要判....
的头像 嵌入式ARM 发表于 09-29 14:39 27次 阅读
C语言中的短路现象

如何实现对通信数据的CRC计算

前言 最近的工作中,要实现对通信数据的CRC计算,所以花了两天的时间好好研究了一下,周末有时间整理了....
的头像 嵌入式ARM 发表于 09-29 14:26 47次 阅读
如何实现对通信数据的CRC计算

KUKA工业机器人搬运工具操作教程三

任务五:运行搬运程序 (1)加载程序示教完成后, 保存好的程序必须加载到内存中才能运行, 选择ban....
的头像 PLC技术圈 发表于 09-29 09:23 127次 阅读
KUKA工业机器人搬运工具操作教程三

KUKA工业机器人搬运工具操作教程二

任务四:示教编程 (1)打开程序 打开已经新建的程序文件banyunl ,进入程序编辑器。程序编辑器....
的头像 PLC技术圈 发表于 09-29 09:19 47次 阅读
KUKA工业机器人搬运工具操作教程二

KUKA工业机器人搬运工具操作教程一

项目描述: 被搬运工件位于图卸料区, 机器人末端气爪从卸料区下端将一个工件夹取, 并将之搬运至图堆垛....
的头像 PLC技术圈 发表于 09-29 09:15 51次 阅读
KUKA工业机器人搬运工具操作教程一

OnRobot推出全电动随机轨道砂光机,可应用于协作型和轻型工业机器人中

  OnRobot推出了OnRobot Sander,这是一种全电动随机轨道砂光机,适用于自动精加工....
的头像 牵手一起梦 发表于 09-28 15:14 84次 阅读
OnRobot推出全电动随机轨道砂光机,可应用于协作型和轻型工业机器人中

详谈Linux操作系统编程的互斥量mutex

前文提到,系统中如果存在资源共享,线程间存在竞争,并且没有合理的同步机制的话,会出现数据混乱的现象。....
的头像 如意 发表于 09-28 15:09 73次 阅读
详谈Linux操作系统编程的互斥量mutex

了解内存:如何在嵌入式C语言中使用结构

处理器如何访问内存?了解有关C语言结构以及如何使用它们的更多信息。 本文将首先解释内存访问粒度的概念....
的头像 嵌入式星球 发表于 09-28 09:46 78次 阅读
了解内存:如何在嵌入式C语言中使用结构

电路方程矩阵形式的习题与解答免费下载

本文档的主要内容详细介绍的是电路方程矩阵形式的习题与解答免费下载。
发表于 09-28 08:00 10次 阅读
电路方程矩阵形式的习题与解答免费下载

C语言的100个经典算法免费下载

本文档的主要内容详细介绍的是C语言的100个经典算法免费下载。
发表于 09-28 08:00 22次 阅读
C语言的100个经典算法免费下载

使用Verilog硬件描述语言实现简易函数发生器的设计说明

简易函数信号发生器在电路实验和设备检测中具有十分广泛的用途。在基于QUARTUS2软件平台下,运用V....
发表于 09-27 16:41 13次 阅读
使用Verilog硬件描述语言实现简易函数发生器的设计说明

学习嵌入式C编程语言:了解联合数据对象

嵌入式C中struct与union的区别 在本系列的上一篇文章中,我们讨论了嵌入式C中的结构允许我们对不同数据类型的变量进行分组并...
发表于 09-27 15:55 202次 阅读
学习嵌入式C编程语言:了解联合数据对象

了解内存:如何在嵌入式C语言中使用结构

处理器如何访问内存?了解有关C语言结构以及如何使用它们的更多信息。 本文将首先解释内存访问粒度的概念,以便我们可以对处理...
发表于 09-27 15:45 101次 阅读
了解内存:如何在嵌入式C语言中使用结构

详谈Linux操作系统编程的条件变量

条件变量是用来等待线程而不是上锁的,条件变量通常和互斥锁一起使用。条件变量之所以要和互斥锁一起使用,....
的头像 如意 发表于 09-27 15:23 12次 阅读
详谈Linux操作系统编程的条件变量

关于单片机入门的常见问题解答

很多同学想要学习单片机,但是没有任何基础,不知道该如何入门,今天就和大家分享一些单片机编程入门前要了....
发表于 09-27 14:42 109次 阅读
关于单片机入门的常见问题解答

嵌入式C语言源代码优化方案 主要优化程序的执行速度

1、选择合适的算法和数据结构 选择一种合适的数据结构很重要,如果在一堆随机存放的数中使用了大量的插入....
的头像 strongerHuang 发表于 09-27 11:45 134次 阅读
嵌入式C语言源代码优化方案  主要优化程序的执行速度

通过一些附加信息和有用的实现技术对C函数的探索

在本文中,我们将通过一些附加信息和一些有用的实现技术来结束对C函数的探索。 基本的C函数(例如,一个....
的头像 multisim 发表于 09-27 11:11 93次 阅读
通过一些附加信息和有用的实现技术对C函数的探索

如何得当使用C语言的特殊的用法

C语言有很多特殊的用法,如果这些特殊用法使用得当,会是你的代码变得更加有健壮,更加容易维护。 比如我....
的头像 strongerHuang 发表于 09-27 10:41 95次 阅读
如何得当使用C语言的特殊的用法

了解嵌入式C:什么是结构?

本文提供了有关嵌入式C编程中的结构的一些基本信息。在介绍了结构之后,我们将看一下这个强大的数据对象的一些重要应
的头像 嵌入式星球 发表于 09-27 09:59 66次 阅读
了解嵌入式C:什么是结构?

了解嵌入式C:什么是结构?

本文提供了有关嵌入式C编程中的结构的一些基本信息。 在介绍了结构之后,我们将看一下这个强大的数据对象的一些重要应用。然后...
发表于 09-27 09:24 202次 阅读
了解嵌入式C:什么是结构?

C++ Primer Plus的PDF的电子书免费下载

本书全面讲述了C语言编程的相关概念和知识。全书共17章。第1、2章学习C语言编程所需的预备知识。第3....
发表于 09-27 08:00 17次 阅读
C++ Primer Plus的PDF的电子书免费下载

C语言内存操作的陷阱!你踩过坑吗?

[table] [tr][td] 1、返回局部变量的地址,或者返回指向局部变量的指针 int *stackref() {     int val; &...
发表于 09-26 16:02 101次 阅读
C语言内存操作的陷阱!你踩过坑吗?

【大联大友尚安森美半导体感光芯片USB双目摄像头模组试用体验】敏感人群自动追踪系统开发

感谢主办方提供的双目摄像头提供测试。本项目利用双目摄像头模组+LattePanda Delta 432+NCS2神经棒部署openvino做一个敏感...
发表于 09-26 14:46 0次 阅读
【大联大友尚安森美半导体感光芯片USB双目摄像头模组试用体验】敏感人群自动追踪系统开发

C语言固件中指针的使用方法

有两个与指针关联的值。第一个是存储在指针本身中的存储地址,第二个是存储在该存储地址中的数据。要修改存....
的头像 multisim 发表于 09-26 11:38 113次 阅读
C语言固件中指针的使用方法

SPI总线驱动的C语言源代码详细概述

本文档的主要内容详细介绍的是SPI总线驱动的C语言源代码详细概述。
的头像 Wildesbeast 发表于 09-26 11:36 168次 阅读
SPI总线驱动的C语言源代码详细概述

I2C总线驱动的C语言源程序详细说明

 i2c 总线上单片机系统中常用到的总线技术这里给大家介绍一个I2C总线驱动的C51语言源程序。
的头像 Wildesbeast 发表于 09-26 11:07 177次 阅读
I2C总线驱动的C语言源程序详细说明

2020年Java开发岗位受欢迎的有哪些?这篇文章将告诉你答案

2020年Java开发岗位受欢迎的有哪些?目前计算机专业的大学生想成为Java工程师,参加以实战项目....
的头像 如意 发表于 09-26 10:28 104次 阅读
2020年Java开发岗位受欢迎的有哪些?这篇文章将告诉你答案

2020年JavaScript开发人员必学的五种有用的业余技能

开发人员的一生可以用两句话概括:计算器,以及学习新技能。成为开发人员绝非易事,他们是解决问题的人,也....
的头像 如意 发表于 09-26 10:01 73次 阅读
2020年JavaScript开发人员必学的五种有用的业余技能

机器人离线编程技术的最新消息

随着工业机器人行业应用领域的不断扩张,促使机器人行业应用软件的工艺性越来越强,从目前中国工业机器人应....
的头像 高工机器人 发表于 09-25 15:45 152次 阅读
机器人离线编程技术的最新消息

单片机编程原理_单片机的应用

在正式进入今天的主题单片机原理之前我们首先要了解单片机是一个什么样的事物,以及特性和应用只有在了解透....
发表于 09-25 15:36 112次 阅读
单片机编程原理_单片机的应用

c语言中一些花里胡哨的写法

转自:嵌入式Linux 我觉得这是一个送分题,奈何知乎人才太多了,给出了各种古怪的写法,如果是做项目....
的头像 strongerHuang 发表于 09-25 14:39 121次 阅读
c语言中一些花里胡哨的写法

工业机器人示教编程与离线编程的区别

工业机器人广泛应用于焊接、装配、搬运、喷漆及打磨等领域,任务的复杂程度不断增加,而用户对产品的质量、....
的头像 PLC技术圈 发表于 09-25 11:42 312次 阅读
工业机器人示教编程与离线编程的区别

Python新手们,快把算法练起来

为什么练习算法是关键? 如果你是Python新手,并且打算面试顶尖公司(FAANG),听着,你需要从....
的头像 数据分析与开发 发表于 09-24 16:10 142次 阅读
Python新手们,快把算法练起来

Redis抢红包项目

业务流程分析 功能拆解 新建红包 在 DB、Redis 分别新增一条记录 抢红包(并发) 「使用技术....
的头像 数据分析与开发 发表于 09-24 15:09 92次 阅读
Redis抢红包项目

要成为鸿蒙开发者,应该学习哪些编程语言

据了解,鸿蒙系统是基于Linux开发的,源码是C语言。那么,作为一名开发者,如何帮助鸿蒙系统构建生态....
的头像 电子发烧友网 发表于 09-24 12:06 452次 阅读
要成为鸿蒙开发者,应该学习哪些编程语言

LabVIEW的学习方法和途径

首先当你想学好LabVIEW的时候,请一定要下定决心,并且要坚持,学习任何事物都是有一个过程的,当你....
的头像 电子发烧友网 发表于 09-24 11:36 172次 阅读
 LabVIEW的学习方法和途径

PLC梯形图编程的方法

PLC梯形图编程,应要遵循一定的规则,并养成良好的习惯。下面以三菱FX系列PLC为例,介绍一下PLC....
的头像 工业机器人前沿 发表于 09-24 10:57 202次 阅读
PLC梯形图编程的方法

如何学习单片机方法和步骤说明

学习单片机的动机不外乎有四种:一是为兴趣爱好而学,二是为专业而学;三是为饭碗而学;四是在工作中被逼而....
发表于 09-24 08:00 45次 阅读
如何学习单片机方法和步骤说明

单片机C语言模块化编程的实例说明

当你在一个项目小组做一个相对较复杂的工程时,意味着你不再独自单干。你需要和你的小组成员分工合作,一起....
发表于 09-24 08:00 108次 阅读
单片机C语言模块化编程的实例说明

如何在量子计算机上编程——QPU编程

蓝色圈的面积就是这个量子态测量后是这个状态的概率,中间的蓝色短线代表他们的相位,因为全局相位也观察不....
的头像 西西 发表于 09-23 14:52 379次 阅读
如何在量子计算机上编程——QPU编程

C语言的主要特征是什么

C语言不仅是IT的必修课,也是所有理工科、甚至所有专业的必修课。它具有简洁紧凑、灵活方便、适用范围大....
的头像 STM32嵌入式开发 发表于 09-23 11:13 98次 阅读
C语言的主要特征是什么

基于C语言实现的贪吃蛇小游戏

定义一个坐标数组,存放的是蛇的每一节蛇身所在的坐标位置。这样就将移动蛇身的操作转换为移动数组的操作,....
的头像 STM32嵌入式开发 发表于 09-23 11:10 70次 阅读
基于C语言实现的贪吃蛇小游戏

执行大量的for循环及嵌套,数组结果溢出

[code]     for(k=0;k
发表于 09-23 10:40 0次 阅读
执行大量的for循环及嵌套,数组结果溢出

ARM嵌入式学习知识图谱-C语言入门系列文章

想要做ARM开发,C语言绝对是重中之重,在这方面是是没有捷径可以走的,这篇文章为大家收集了论坛的优秀C语言初级文章,希望...
发表于 09-23 10:05 303次 阅读
ARM嵌入式学习知识图谱-C语言入门系列文章

AT24C02的引脚功能和在Keil C中的程序编写步骤

AT24C02是美国Atmel公司的低功耗CMOS型E2PROM,内含256×8位存储空间,具有工作....
的头像 电子设计 发表于 09-22 17:30 198次 阅读
AT24C02的引脚功能和在Keil C中的程序编写步骤

单片机程序的编写方法

学习单片机最主要的是学习写程序的方法,程序的功能千变万化,是学不完的,只有掌握了一定方法,才能用这种....
发表于 09-22 17:17 249次 阅读
单片机程序的编写方法

HarmonyOS应用开发-API参考

API(Application Programming Interface,应用程序编程接口)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软...
发表于 09-22 15:14 101次 阅读
HarmonyOS应用开发-API参考

C语言内存操作有哪些陷进

如从stdin读取一个int变量时,scanf(“%d”, &val);是正确用法,若误写为scan....
的头像 嵌入式ARM 发表于 09-22 14:45 173次 阅读
C语言内存操作有哪些陷进

PLC的发展状况_特点_应用领域

作为工业自动化的一种典型应用,PLC最初是做为取代继电器线路、进行顺序控制为主而产生的,后来PLC厂....
的头像 传感器技术 发表于 09-22 09:50 694次 阅读
PLC的发展状况_特点_应用领域

步进电机综合控制的C语言程序和工程文件免费下载

本文档的主要内容详细介绍的是步进电机综合控制的C语言程序和工程文件免费下载。
发表于 09-22 08:00 26次 阅读
步进电机综合控制的C语言程序和工程文件免费下载

NumPy 诞生过去15年后 其核心开发团队的论文终于在 Nature 上发表

NumPy 是什么?它是大名鼎鼎的使用 Python 进行科学计算的基础软件包,是 Python 生....
的头像 通信信号处理研究所 发表于 09-21 16:25 211次 阅读
NumPy 诞生过去15年后  其核心开发团队的论文终于在 Nature 上发表

什么是嵌入式_如何入门和提高嵌入式

因为首先,嵌入式有不少组合名词,例如嵌入式系统,嵌入式软件,Linux嵌入式,Android嵌入式,....
发表于 09-21 15:00 175次 阅读
什么是嵌入式_如何入门和提高嵌入式

如何将自由运行的RTL内核、Vitis库和基于hls的数据迁移器组合在一起

赛灵思致力于为所有开发人员开启一种新的设计体验! Vitis统一软件平台可以在包括FPGA、SoC和....
的头像 FPGA开发圈 发表于 09-21 14:15 196次 阅读
如何将自由运行的RTL内核、Vitis库和基于hls的数据迁移器组合在一起

TIOBE已公布2020年9月的编程语言排行榜

TIOBE 每个月都会公布一次编程语言的排行榜,这份排行榜排名基于全球技术工程师、课程和第三方供应商....
的头像 玩转单片机 发表于 09-21 14:13 832次 阅读
TIOBE已公布2020年9月的编程语言排行榜

嵌入式C语言源代码优化方案(非编译器优化)

选择一种合适的数据结构很重要,如果在一堆随机存放的数中使用了大量的插入和删除指令,那使用链表要快得多....
的头像 嵌入式ARM 发表于 09-21 11:55 286次 阅读
嵌入式C语言源代码优化方案(非编译器优化)