0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基本语句编程的一些规则和建议

GReq_mcu168 来源:C语言与CPP编程 作者:自成一派123 2022-04-27 12:53 次阅读

初学者阶段编程时,编写基本语句可能会有隐含错误的方式,基本语句主要针对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++基本语句编程风格

文章出处:【微信公众号:硬件攻城狮】欢迎添加关注!文章转载请注明出处。

审核编辑:汤梓红
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • C语言
    +关注

    关注

    180

    文章

    7596

    浏览量

    135960
  • 编程
    +关注

    关注

    88

    文章

    3576

    浏览量

    93545
  • 基本语句
    +关注

    关注

    0

    文章

    4

    浏览量

    1025

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

文章出处:【微信号:mcu168,微信公众号:硬件攻城狮】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    PCB布线需要遵循的一些基本规则

    布线是PCB设计的重要组成部分,也是整个PCB设计中工作量最大和最耗时间的部分,工程师在进行PCB布线工作时,需要遵循一些基本的规则,如倒角规则、3W规则等。
    发表于 10-31 14:30 1603次阅读

    关于编程一些问题

    开始学习编程的时候没想那么多,可是现在编的程序大了之后开始考虑一些算法的东西 因为编程的时候都是在大脑里想的逻辑顺序 然后就直接编程 可是随着程序代码量大了之后,自己越来越困难了
    发表于 10-30 20:59

    关于编程一些问题?

    本人对编程来说,是个小白的,请问下,我怎么能够快速成长成为编程高手,能够自己写代码的?有谁能提供一些忠实的意见的吗?谢谢,还请过来人能够多多谈谈的,谢谢,经验分享下,不胜感激,是不
    发表于 06-03 22:35

    讲解Matlab的一些编程语句

    第5章 Matlab简易使用之常用编程语句本期教程主要是讲解Matlab的一些编程语句。目录第5章 Matlab简易使用之常用
    发表于 08-17 07:45

    关于电源线的一些规则

    **关于过孔的大小:电源还没学完,待续。。。。关于电源线的一些规则:待续本章的一些零碎总结:1.不改变规则前提下消除错误绿色提示T+M2.电源布线尽量宽
    发表于 11-11 07:09

    讲解Matlab的一些编程语句

    Matlab常用的编程语句有哪些呢?怎样去使用这些编程语句呢?
    发表于 11-18 07:30

    介绍一些常见的汇编语句

    即使使用C/C++或者其他高级语言编程,最后也会被编译工具转换为汇编代码,并最终作为机器码存储在内存、硬盘或者其他存储器上。在调试程序时,经常需要阅读它的汇编代码.这里介绍一些自己常见的汇编语句
    发表于 12-20 06:05

    PCB布板一些简易常用规则

    PCB布板一些简易常用规则   这几天还是关注一些简单入门的东西吧,主要介绍一些PCB中一些
    发表于 11-21 14:34 6614次阅读

    如何使用PU学习进行建议语句分类的方法说明

    建议挖掘作为项新兴研究任务,具有重要的应用价值。针对传统建议语句分类方法所存在的规则复杂、标注工作量大、特征维度高、数据稀疏等问题,提出
    发表于 03-27 11:26 4次下载
    如何使用PU学习进行<b class='flag-5'>建议</b><b class='flag-5'>语句</b>分类的方法说明

    关于学习Linux的一些建议

    不管是在生活还是工作中,每个人都会逐渐养成一些小习惯。坏习惯旦形成就很难改正,所在在系统学习 Linux 之前,给大家一些建议,刻意去培养一些
    发表于 07-14 14:22 582次阅读

    了解一些C程序的基本规则

    程序由个或多个函数组成,其中定有个名为 main()的函数。函数的描述由函数头和函数体组成。函数头包括预处理语句#include和函数名。可以通过圆括号识别
    的头像 发表于 07-27 11:01 2487次阅读
    了解<b class='flag-5'>一些</b>C程序的基本<b class='flag-5'>规则</b>

    APT触摸布局的一些建议详细说明

    本文档的主要内容详细介绍的是APT触摸布局的一些建议详细说明。
    发表于 10-27 08:00 0次下载
    APT触摸布局的<b class='flag-5'>一些</b><b class='flag-5'>建议</b>详细说明

    一些与众不同的PCB布线经验规则

    PCB设计论坛中的 遵守/避免布线法则,使得PCB设计者在这些规则也许不适用的地方要么遵守,要么忽略他们。一些情况下,这未必造成电路板设
    的头像 发表于 11-01 10:33 3085次阅读

    学习linux内核的一些建议

    学习linux内核,这个可不像学门语言,c或者java个月或者3月你就能精通掌握。学习linux内核是需要步循序渐进,掌握正确的linux内核学习路线对学习至关重要,本篇文章
    发表于 05-07 15:20 604次阅读
    学习linux内核的<b class='flag-5'>一些</b><b class='flag-5'>建议</b>

    针对RF PCBA设计的一些建议

    射频(RF)PCBA设计涉及系列复杂的考虑因素,包括天线设计、滤波器设计以及传输线(RF Trace)的优化。这些因素对于无线通信和射频应用的性能至关重要。以下是针对RF PCBA设计的一些建议
    的头像 发表于 10-30 10:19 448次阅读