⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 c programing practice.htm

📁 C编程实践练习
💻 HTM
📖 第 1 页 / 共 3 页
字号:
                  下标以零作为开始的这一事实使所有的计数问题变得更简单。然而,掌握如何处理它们需要花些努力。 <BR>空语句 
                  <BR><BR>for 或 while 
                  循环的空语句体应当单独位于一行并加上注释,这样就表明这个空语句体是有意放置的,而不是遗漏了代码。 <BR><BR>
                  <TABLE cellSpacing=0 cellPadding=5 width=450 bgColor=#cccccc 
                  border=1>
                    <TBODY>
                    <TR>
                      <TD><PRE>while (*dest++ = *src++) <BR>   	 ;   /* VOID */</PRE></TD></TR></TBODY></TABLE><BR>测试真(true)还是假(false) 
                  <BR><BR>不要以缺省方式测试非零值,即: <BR><BR>
                  <TABLE cellSpacing=0 cellPadding=5 width=450 bgColor=#cccccc 
                  border=1>
                    <TBODY>
                    <TR>
                      <TD><PRE>if (f() != FAIL)</PRE></TD></TR></TBODY></TABLE><BR><BR>优于 
                  <BR><BR>
                  <TABLE cellSpacing=0 cellPadding=5 width=450 bgColor=#cccccc 
                  border=1>
                    <TBODY>
                    <TR>
                      <TD><PRE>if (f())</PRE></TD></TR></TBODY></TABLE><BR><BR>尽管 FAIL 
                  的值可能是 0(在 C 
                  中视为假(false))。(当然,应当在这一风格与“函数名”一节中演示的构造之间作出权衡。)当以后有人认为失败的返回值应该是 
                  -1 而不是 0 时,显式的测试对您会有帮助。 <BR><BR>常见的问题是使用 strcmp 
                  函数测试字符串是否相等,决不应该以缺省方式处理它的结果。更可取的方法是定义宏 STREQ: <BR><BR>
                  <TABLE cellSpacing=0 cellPadding=5 width=450 bgColor=#cccccc 
                  border=1>
                    <TBODY>
                    <TR>
                      <TD><PRE>#define STREQ(str1, str2) (strcmp((str1), (str2)) == 0)</PRE></TD></TR></TBODY></TABLE><BR><BR>用这种方法,语句 
                  <BR><BR>
                  <TABLE cellSpacing=0 cellPadding=5 width=450 bgColor=#cccccc 
                  border=1>
                    <TBODY>
                    <TR>
                      <TD><PRE>If ( STREQ( inputstring, somestring ) ) ...</PRE></TD></TR></TBODY></TABLE><BR><BR>就具有隐含的行为,该行为不大会在您不知情的情况下改变(人们往往不会重新编写或重新定义象 
                  strcmp() 这样的标准库函数)。 <BR><BR>不要用 1 检查相等性的布尔值(TRUE 和 YES 等);而要用 
                  0 测试不等性(FALSE 和 NO 等)。绝大多数函数被确保在条件为假(false)时返回 
                  0,但仅在条件为真(true)时才返回非零。因此,最好将 <BR><BR>
                  <TABLE cellSpacing=0 cellPadding=5 width=450 bgColor=#cccccc 
                  border=1>
                    <TBODY>
                    <TR>
                      <TD><PRE>if (func() == TRUE) {...</PRE></TD></TR></TBODY></TABLE><BR><BR>写成 
                  <BR><BR>
                  <TABLE cellSpacing=0 cellPadding=5 width=450 bgColor=#cccccc 
                  border=1>
                    <TBODY>
                    <TR>
                      <TD><PRE>if (func() != FALSE)</PRE></TD></TR></TBODY></TABLE><BR>嵌入语句 
                  <BR><BR>使用嵌入赋值语句要看时间和地点。在有些构造中,如果不使用更多且不易阅读的代码就没有更好的方法来实现结果: 
                  <BR><BR>
                  <TABLE cellSpacing=0 cellPadding=5 width=450 bgColor=#cccccc 
                  border=1>
                    <TBODY>
                    <TR>
                      <TD><PRE>while ((c = getchar()) != EOF) { <BR>  	  process the character <BR>	}</PRE></TD></TR></TBODY></TABLE><BR><BR>使用嵌入赋值语句来提高运行时性能是可能的。但是,您应当在提高速度和降低可维护性之间加以权衡,在人为指定的位置使用嵌入赋值语句会导致可维护性降低。例如: 
                  <BR><BR>
                  <TABLE cellSpacing=0 cellPadding=5 width=450 bgColor=#cccccc 
                  border=1>
                    <TBODY>
                    <TR>
                      <TD><PRE>x = y + z; <BR>	d = x + r;</PRE></TD></TR></TBODY></TABLE><BR>不应被替换为: 
                  <BR><BR>
                  <TABLE cellSpacing=0 cellPadding=5 width=450 bgColor=#cccccc 
                  border=1>
                    <TBODY>
                    <TR>
                      <TD><PRE>d = (x = y + z) + r;</PRE></TD></TR></TBODY></TABLE><BR><BR>即使后者可能节省一个周期也不行。最终,这两者之间在运行时间上的差异将随着优化器的增强而减少,易维护性的差异却将增加。 
                  <BR>goto 语句 <BR><BR>应保守地使用 goto 。从数层 switch 、for 和while 
                  嵌套中跳出来时,使用该语句很有效,不过,如果有这样的需要,则表明应将内部构造分解成单独的函数。 <BR><BR>
                  <TABLE cellSpacing=0 cellPadding=5 width=450 bgColor=#cccccc 
                  border=1>
                    <TBODY>
                    <TR>
                      <TD><PRE>for (...) { <BR>      		while (...) { <BR>    		  ... <BR>                  if (wrong) <BR>               	     goto error; <BR>         <BR>       	            } <BR>		 } <BR>    		... <BR>            error: <BR>   	       print a message</PRE></TD></TR></TBODY></TABLE><BR><BR>当必须使用 
                  goto 时,随附的标号应单独位于一行,并且同后续代码的左边相距一个制表符或位于一行的开头。对 goto 
                  语句和目标都应加上注释,说明其作用和目的。 <BR>switch 中的“落空”(fall-through) 
                  <BR><BR>当一块代码有数个标号时,将这些标号放在单独的行。这种风格与垂直空格的使用一致,并且使重新安排 case 
                  选项(如果那是必需的话)成了一项简单的任务。应对 C switch 
                  语句的“落空”特征加以注释,以便于以后的维护。如果这一特性曾给您带来“麻烦”,那么您就能够理解这样做的重要性! 
                  <BR><BR>
                  <TABLE cellSpacing=0 cellPadding=5 width=450 bgColor=#cccccc 
                  border=1>
                    <TBODY>
                    <TR>
                      <TD><PRE>switch (expr) { <BR>	case ABC:	 <BR>	case DEF: <BR>    		statement; <BR>    		break; <BR>	case UVW: <BR>	    	statement;	/*FALLTHROUGH*/	 <BR>	case XYZ: <BR>    		statement; <BR>  	  	break;	 <BR>	}</PRE></TD></TR></TBODY></TABLE><BR><BR>尽管从技术上说,最后一个 
                  break 不是必需的,但是,如果以后要在最后一个 case 之后添加了另一个 case,那么一致地使用 break 
                  可以防止“落空”错误。如果使用 default case 语句的话, 
                  它应当永远是最后一个,并且(如果它是最后的语句)不需要最后的 break 语句。 <BR>常量 
                  <BR><BR>符号常量使代码更易于阅读。应尽量避免使用数字常量;使用 C 预处理器的 #define 
                  函数给常量赋予一个有意义的名称。在一个位置(最好在头文件中)定义值还会使得管理大型程序变得更容易,因为只需更改定义就可以统一地更改常量值。可以考虑使用枚举数据类型作为对声明只取一组离散值的变量的改进方法。使用枚举还可以让编译器对您枚举类型的任何误用发出警告。任何直接编码的数字常量必须至少有一个说明值的出处的注释。 
                  <BR><BR>常量的定义与它的使用应该一致;例如,将 540.0 用于浮点数,而不要通过隐式浮点类型强制转换使用 
                  540。也就是说,在有些情况下,常量 0 和 1 可以以本身的形式直接出现,而不要以定义的形式出现。例如,如果某个 for 
                  循环遍历一个数组,那么: <BR><BR>
                  <TABLE cellSpacing=0 cellPadding=5 width=450 bgColor=#cccccc 
                  border=1>
                    <TBODY>
                    <TR>
                      <TD><PRE>for (i = 0; i &lt; arraysub; i++)</PRE></TD></TR></TBODY></TABLE><BR><BR>非常合理,而代码: 
                  <BR><BR>
                  <TABLE cellSpacing=0 cellPadding=5 width=450 bgColor=#cccccc 
                  border=1>
                    <TBODY>
                    <TR>
                      <TD><PRE>gate_t *front_gate = opens(gate[i], 7); <BR>	if (front_gate == 0) <BR> 	   error("can't open %s\n", gate[i]);</PRE></TD></TR></TBODY></TABLE><BR><BR>就不合理。在第二个示例中,front_gate 
                  是指针;当值是指针时,它应与 NULL 比较而不与 0 比较。即使象 1 或 0 这样的简单值,通常最好也使用象 TRUE 
                  和 FALSE 这样的定义来表示(有时 YES 和 NO 读起来更清楚)。 
                  <BR><BR>不要在需要离散值的地方使用浮点变量。这是由于浮点数不精确的表示决定的(请参阅以上 scanf 
                  中的第二个测试)。使用 &lt;= 或 &gt;= 测试浮点数;精确比较(== 或 !=)也许不能检测出“可接受的”等同性。 
                  <BR><BR>应将简单的字符常量定义为字符文字而不是数字。不提倡使用非文本字符,因为它们是不可移植的。如果必须使用非文本字符,尤其是在字符串中使用它们,则应使用三位八进制数(不是一个字符)的转义字符(例如“\007”)来编写它们。即便如此,这样的用法应视为与机器相关,并且应按这一情况来处理。 
                  <BR>条件编译 
                  <BR><BR>条件编译可用于机器相关性、调试以及在编译时设置某些选项。可以用无法预料的方式轻易地组合各种控制。如果将 
                  #ifdef 用于机器相关性,应确保当没有指定机器时会出错,而不是使用缺省的机器。#error 
                  伪指令可以较方便地用于这一用途。如果使用 #ifdef 
                  进行优化,缺省值应是未优化的代码而不是不可编译或不正确的程序。要确保对未优化的代码进行了测试。 
                  <BR><BR><B>其它</B> <BR>象Make 
                  这样用于编译和链接的实用程序极大简化了将应用程序从一个环境移到另一个环境的任务。在开发期间, make 仅对那些自上次使用 
                  make 以来发生了更改的模块进行重新编译。 <BR><BR>经常使用 lint 。lint 是 C 程序检查器,它检查 C 
                  源文件以检测并报告函数定义和调用之间类型的不匹配和不一致,以及可能存在的程序错误等。 
                  <BR><BR>此外,研究一下编译器文档,了解那些使编译器变得“吹毛求疵”的开关。编译器的工作是力求精确,因此通过使用适当的命令行选项让它报告可能存在的错误。 
                  <BR>使应用程序中全局符号的数量最少。这样做的好处之一是与系统定义的函数冲突的可能性降低。 
                  <BR>许多程序在遗漏输入时会失败。对所有的程序都应进行空输入测试。这也可能帮助您理解程序的工作原理。 
                  <BR>不要对您的用户或您所用的语言实现有任何过多的假设。那些“不可能发生”的事情有时的确会发生。健壮的程序可以防范这样的情形。如果需要找到某个边界条件,您的用户将以某种方式找到它! 
                  <BR><BR>永远不要对给定类型的大小作任何假设,尤其是指针。 <BR><BR>当在表达式中使用 char 
                  类型时,大多数实现将它们当作无符号类型,但有些实现把它们作为有符号的类型。当在算术表达式使用它们时,建议始终对它们进行类型强制转换。 
                  <BR><BR>不要依靠对自动变量和 malloc 返回的内存进行的初始化。 <BR>使您程序的目的和结构清晰。 
                  <BR>要记住,可能会在以后要求您或别的人修改您的代码或在别的机器上运行它。细心编写您的代码,以便能够将它移植到其它机器。 
                  <BR><BR><B>结束语</B> 
                  <BR>应用程序的维护要花去程序员的大量时间,这是众所周知的事。部分原因是由于在开发应用程序时,使用了不可移植和非标准的特性,以及不令人满意的编程风格。在本文中,我们介绍了一些指南,多年来它们一直给予我们很大帮助。我们相信,只要遵守这些指南,将可以使应用程序维护在团队环境中变得更容易。 
                  <BR><BR><B>参考资料</B> <BR>Obfuscated C and Other Mysteries,由 Don 
                  Libes 编写,John Wiley and Sons, Inc. ISBN 0-471-57805-3 <BR>The 
                  C Programming Language,Second Edition,由 Brian W. Kernighan 和 
                  Dennis M. Ritchie 撰写,Prentice-Hall,ISBN 0-13-110370-9 
                  <BR>Safer C,由 Les Hatton 编写,McGraw-Hill,ISBN 0-07-707640-0 
                  <BR>C Traps and Pitfalls 由 Andrew Koenig 编写,AT&amp;T Bell 
                  Laboratories,ISBN 0-201-17928-9 <BR><BR><B>关于作者</B> <BR>Shiv 
                  Dutta 是 IBM Systems Group 的一名技术顾问,他帮助独立软件供应商在 pSeries 
                  服务器启用他们的应用程序。Shiv 有作为软件开发人员、系统管理员和讲师的丰富经验。他在 AIX 
                  的系统管理、问题确定、性能调优和规模指导方面提供支持。Shiv 在 AIX 诞生之时就从事这方面的工作。他从 Ohio 
                  University 获得物理博士学位,可以通过 sdutta@us.ibm.com 与他联系。 <BR><BR>Gary 
                  R. Hook 是 IBM 的高级技术顾问,为独立软件供应商提供应用程序开发、移植和技术援助。Hook 
                  先生的职业经历主要在基于 Unix 的应用程序开发方面。在 1990 年加入 IBM 时,他在位于得克萨斯州 
                  Southlake 的 AIX Technical Support 中心工作,为客户提供咨询和技术支持服务,重点在 AIX 
                  应用程序体系结构方面。Hook 先生现在居住在奥斯汀,在 1995 到 2000 年期间,他是 AIX Kernel 
                  Development 团队的一员,专门研究 AIX 链接程序、装入程序和通用应用程序开发工具。可以通过 <A 
                  href="mailto:ghook@us.ibm.com">ghook@us.ibm.com</A> 
                  与他联系。<BR><BR>全文出自 : <A 
                  href="http://www-900.ibm.com/developerWorks/cn/linux/l-bppc/index.shtml">IBM 
                  DeveloperWorks 中国网站</A> 
                  <P><IMG height=32 src="豆豆技术网--C 编程最佳实践.files/94.gif" 
                  width=32><BR></P><BR></TD>
                <TD width=20 
                background="豆豆技术网--C 编程最佳实践.files/bg2.gif">&nbsp;</TD></TR></TBODY></TABLE></TD></TR>
        <TR>
          <TD>&nbsp;</TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE>
<HR align=center width=750 color=#51a8ff SIZE=1>

<TABLE cellSpacing=0 cellPadding=0 width=750 align=center border=0>
  <TBODY>
  <TR>
    <TD align=middle height=74>
      <SCRIPT src="豆豆技术网--C 编程最佳实践.files/explain.js"></SCRIPT>
    </TD>
  <TR>
    <TD>
      <HR align=center width=300 color=#51a8ff SIZE=1>
    </TD></TR></TR>
  <TR>
    <TD align=middle height=74>
      <SCRIPT src="豆豆技术网--C 编程最佳实践.files/foot1.js"></SCRIPT>
    </TD></TR></TBODY></TABLE>
<SCRIPT src="豆豆技术网--C 编程最佳实践.files/left.js"></SCRIPT>

<SCRIPT language=javascript src="豆豆技术网--C 编程最佳实践.files/pf.js"></SCRIPT>
</BODY></HTML>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -