如何提高C语言代码质量?

Posted 嵌入式软件开发学习圈

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何提高C语言代码质量?相关的知识,希望对你有一定的参考价值。

关注“嵌入式软件学习圈”免费获取更多学习教程 

char 类型变量的值应该限制在signed charunsigned char 的交集范围内

大家应该都知道,C语言设计char类型的目的是存储字母和标点符号之类的字符。实际上, char类型存储的是整数而不是字符。为了处理字符,计算机使用一种数字编码的方式来操作,如常见的ASCII就是用特定整数来表示特定字符的。例如,要在ASCII码中存储字母B,实际上只需要存储整数66。因此,可以使用下面的方法为char类型的变量赋值。char c=66;

ASCII码中,整型数据66char类型的大小范围之内,所以这样的赋值方式是完全允许的,但不推荐使用这样的赋值方式

这里需要注意的是,采用这样的赋值方式有个前提条件,即必须是在ASCII码中。有时候不同的计算机系统也会使用完全不同的编码,如一些IBM主机就使用一种称为EBCDIC( Extended Binary-Coded Decimal Interchange Code,扩充的二进制编码的十进制交换码)的编码方式。如果采用的是其他编码方式,这样的赋值方式所得到的结果就不- -样了。因此,我们推荐使用字符常量的方式进行赋值,如下面的代码所示:

char c='B' ;

除此之外,在表中还可以看出,默认的char类型可以是signed char类型取值范围为-127~127),也可以是unsigned char类型(取值范围为0~255),具体取决于编译器。

也就是说,不同的机器上char可能拥有不同范围的值。因此,为了使程序保持良好的可移植性,我们所声明的char类型变量的值应该限制在signed charunsigned char的交集范围内。

例如,ASCII字符集中的字符都在这个范围内。当然,在一个把字符当做整数值的处理程序中,可以显式地把这类变量声明为signed charunsigned char,从而确保不同的机器中在字符是否为有符号值方面保持致,以此来提高程序的可移植性。另一方面,许多处理字符的库函数把它们的参数都声明为char,

如果我们把这些参数显式地声明为signed charunsigned char,可能会带来兼容性问题;并且有些机器处理signed char的效率更高些,如果硬要把它改成unsigned char,效率很可能会因此而受损。所以把所有的char变量统一声明为signedcharunsignedchar未必就是好的解决方案。因此,最佳的解决方案就是把char类型变量的值限制在signedcharunsignedchar的交集范围内,这样既可以获得最大程度的可移植性,同时又不会牺牲效率。


使用显式声明为signed charunsigned char的类型来执行算术运算

在讨论本建议话题之前,我们先看看下面的这段代码的输出结果,如代码清单1-1所示。

 

#include <stdio.h>

int main(void)

(

char c=150 ;

int i=900;

printf("i/c=%dn", i/c) ;

return 0;

)

 

 

在代码中,或许大多数人都认为它输出的结果应该是“i/c= 6”,但实际的输出结果却大相径庭。前面已经讲过,char 类型的变量c可以有两种类型:有符号的(signed char)和无符号的( unsigned char)。这里假设char8位的补码字 符类型,那么代码清单就可能输出“i/c=-8( signed char) 或者“i/c= 6( unsigned char) 两种结果。其中,Microsoft Visual Studio 2010GCC中的输出结果都是“i/c=-8",如图

 

  

 

其实,导致这种结果最根本的原因就在于我们不能够准确地确定char类型的变量c究竟signed char类型还是unsigned char类型。因此,我们把决策权交给编译器,而不同的编译器默认的char类型是不同的,所以最后得到的结果也就不相同。解决这种问题的办法很简单,就是显式地将char类型的变量c声明为signedcharunsigned char类型,这样可保证结果的唯一性,如代码清单1-2所示。

#include <stdio.h>

int main(void)

unsigned char c=150;

int i=900;

printf("i/c=%dn", i/c) ;

return 0;

这样就显式地将char类型的变量c声明为unsignedchar类型,现在,后面的除法运算(i/c) char的符号无关,所以代码清单1-2输出的结果为“i/c= 6”。



如何提高C语言代码质量?历史消息



汽车电子入门历史消息

汽车电子控制技术入门(十) 主要讲述:ECU硬件软件的开发流程,以及控制过程包括:开环,闭环控制,链接为:


汽车电子控制技术入门(九) 主要讲述:氧传感器功用, 氧传感分类氧化锆(ZrO2)氧化钛(TiO2)氧化锆式氧传感器和氧化钛式氧传感器 工作原理,链接为:


汽车电子控制技术入门(八) 主要讲述:电子控制系统的组成、曲轴位置传感器工作原理、凸轮轴位置传感器(磁感式、霍尔式、光电式)工作原理,链接为:


汽车电子控制技术入门(七) 主要讲述:电动燃油泵、燃油分配管、燃油压力调节器、喷油器等组成以及其工作原理 链接为:


汽车电子控制技术入门(六) 主要讲述:燃油供给系统的组成、电动燃油泵的工作原理。链接为:


汽车电子控制技术入门(五) 主要讲述:温度传感器的组成分类,以及工作原理。链接为:


汽车电子控制技术入门(四) 主要讲述:空气式流量传感器的分类以及工作原理,节气门位置传感器的组成和工作原理。链接为:


汽车电子控制技术入门(三) 主要讲述:发动机电子控制系统,电子控制燃油喷射系统的分类和基本组成,空气供给系统的组成和工作原理。链接为:


汽车电子控制技术入门(二) 主要讲述:汽车电子控制技术的发展趋势,1、控制系统集成化,2、信息传输网络化,3、汽车和交通智能化,4、电控系统设计模块化,以及介绍了汽车电控系统的基本组成:传感器、执行器、ECU.链接为:


汽车电子控制技术入门(一) 主要讲述:汽车电子控制技术的发展,以及三个发展阶段:模拟电子电路阶段,微型计算控制阶段,车载局域网控制阶段。链接为:




 

 


以上是关于如何提高C语言代码质量?的主要内容,如果未能解决你的问题,请参考以下文章

如何提高C语言代码质量?

如何提高C语言代码质量?

C语言编程代码好坏如何判断

静态函数库的制作和使用

每周一书-编写高质量代码:改善C程序代码的125个建议

如何保障Go语言基础代码质量?