C语言编程技巧-之二课件

上传人:我*** 文档编号:144990361 上传时间:2020-09-15 格式:PPT 页数:35 大小:237.50KB
返回 下载 相关 举报
C语言编程技巧-之二课件_第1页
第1页 / 共35页
C语言编程技巧-之二课件_第2页
第2页 / 共35页
C语言编程技巧-之二课件_第3页
第3页 / 共35页
C语言编程技巧-之二课件_第4页
第4页 / 共35页
C语言编程技巧-之二课件_第5页
第5页 / 共35页
点击查看更多>>
资源描述

《C语言编程技巧-之二课件》由会员分享,可在线阅读,更多相关《C语言编程技巧-之二课件(35页珍藏版)》请在金锄头文库上搜索。

1、C语言编程技巧之二,表达式和基本语句 常量和宏变量,第4章 表达式和基本语句,表达式和语句都属于C+/C的短语结构语法。 很多程序员用隐含错误的方式写表达式和基本语句。 主要讨论:if、for、while、goto、switch 4.1 运算符的优先级 4.2 复合表达式 4.3 if 语句 4.4 循环语句的效率 4.5 for 语句的循环控制变量 4.6 switch语句 4.7 goto 语句,4.1 运算符的优先级,C+/C语言的运算符有数十个,运算符的优先级与结合律如表4-1所示。 一元运算符 + - * 的优先级高于对应的二元运算符。,【建议4-1】如果代码行中的运算符比较多,用括

2、号确定表达式的操作顺序,避免使用默认的优先级。 为了防止产生歧义并提高可读性,应当用括号确定表达式的操作顺序。,word = (high 8) | low if (a | b) 允许复合表达式存在的理由是: (1)书写简洁; (2)可以提高编译效率。 但要防止滥用复合表达式。 若变量名较长,不要连写赋值语句。 pthisJring-n = pthisJring-m = pthisJring-k =0; /语句太长,不清晰 pthisJring-n = 0;/这样语句排列整齐明确 pthisJring-m = 0; pthisJring-k = 0;,6,【建议4-2】不要编写太复杂的复合表达式

3、。 【建议4-3】不要有多用途的复合表达式。,i = a = b / 复合表达式过于复杂,d = (a = b + c) + r ; /表达式两个用途:求a值也求d值,应该拆分,a = b + c; /求a值 d = a + r; /求d值,i =( (a = b) /上式的含义,【建议4-4】不要把程序中的复合表达式与“真正的数学表达式”混淆。 if (a b c) / a b c是数学表达式而不是程序表达式并不表示 if (ab) if (value = 0) /这样比较表示value是整型变量 if (value != 0),int value = 1; if (value) / 会让人

4、误解 value是布尔变量 if (!value),4.3.3 浮点变量与零值比较,【建议4-7】不可将浮点变量用“=”或“!=”与任何数字比较。千万要留意,无论是float还是double类型的变量,都有精度限制,应该设法转化成“=”或“=”形式。,float x; if (x = 0.0) / 隐含错误的比较,#define EPSINON 0.00001 /允许的误差 float x; if (x=-EPSINON) if (p = NULL) / p与NULL显式比较,强调p是指针变量 if (p != NULL) / p与NULL显式比较,强调p是指针变量,if (p = 0) /

5、容易让人误解p是整型变量 if (p != 0) if (p) / 容易让人误解p是布尔变量 if (!p),4.3.5 对if语句的补充说明,有时候我们可能会看到 if (NULL = p) 这样古怪的格式。不是程序写错了,是程序员为了防止将 if (p= NULL) 误写成 if (p = NULL),而有意把p和NULL颠倒。,if (NULL = p) / if (p = NULL) /是合法的,但是含义与程序员设想不同 if (NULL = p) /是错误的,程序中有时会遇到if/else/return的组合,应该将如下不良风格的程序,if (condition) return x;

6、 return y;,if (condition) return x; else return y; ,return (condition ? x : y); /更加简练,4.4 循环语句的效率,C+/C循环语句中,for语句使用频率最高,while语句其次,do语句很少用。 提高循环体效率的基本办法是降低循环体的复杂性。 【建议4-9】在多重循环中,如果有可能,应当将最长的循环放在最内层,最短的循环放在最外层,以减少CPU跨切循环层的次数。,for (row=0; row100; row+) for ( col=0; col5; col+ ) sum = sum + arowcol; /低效

7、率:长循环在最外层,for (col=0; col5; col+ ) for (row=0; row100; row+) sum = sum + arowcol; /高效率:长循环在最内层,【建议4-10】如果循环体内存在逻辑判断,并且循环次数很大,宜将逻辑判断移到循环体的外面。,for (i=0; iN; i+) if (condition) /执行了N次逻辑判断 DoSomething(); else DoOtherthing(); /效率低但程序简洁,if (condition) /执行了1次逻辑判断 for (i=0; iN; i+) DoSomething(); else for (

8、i=0; iN; i+) DoOtherthing(); /效率高但程序不简洁,4.5 for 语句的循环控制变量,【建议4-11】不可在for 循环体内修改循环变量,防止for 循环失去控制。 【建议4-12】建议for语句的循环控制变量的取值采用“半开半闭区间”写法。,for (int x=0; xN; x+) /循环变量属于半开半闭区间,for (int x=0; x=N-1; x+) /循环变量属于闭区间,4.6 switch语句,switch语句存在的理由 switch是多分支选择语句,而if语句只有两个分支可供选择。 用嵌套的if语句来实现多分支选择,但那样的程序冗长难读。,/sw

9、itch语句的基本格式 switch (variable) case value1 : break; /不要忘了加break case value2 : break; /不要忘了加break default : /不要忘记default分支 break; ,【建议4-13】每个case语句的结尾不要忘了加break,否则将导致多个分支重叠(除非有意使多个分支重叠)。 【建议4-14】不要忘记最后那个default分支。即使程序真的不需要default处理,也应该保留语句 default : break; 这样做并非多此一举,而是为了防止别人误以为你忘了default处理。,21,Status

10、BracketsMatch() char ch; SqStack S; InitStack(S); ch = getchar(); / 从终端接一个字符 int flag=1; while (flag /end of function BracketsMatch(),4.7 goto语句,自从提倡结构化设计以来,goto就成了有争议的语句。首先,由于goto语句可以灵活跳转,如果不加限制,它的确会破坏结构化设计风格。 其次,goto语句经常带来错误或隐患。它可能跳过了某些对象的构造、变量的初始化、重要的计算等语句,,goto state; String s1, s2; / 被goto跳过 in

11、t sum = 0; / 被goto跳过 state: ,5 常量和宏,常量是一种标识符,它的值在运行期间恒定不变。 C和C+语言用 #define来定义常量(称为宏常量)。 C+语言还可以用const来定义常量(称为const常量) 5.1 为什么需要常量 5.2 const 与宏常量的比较 5.3 常量定义建议 5.4 static 变量 5.5 宏定义#define 5.6 宏函数 5.7 宏函数还是inline函数?,24,【建议5-1】 尽量使用含义直观的常量来表示那些将在程序中多次出现的数字或字符串。,#define MAX 100 /* C语言的宏常量 */ const int

12、MAX = 100; / C+ 语言的const常量 const float PI = 3.14159; / C+ 语言的const常量,5.1 为什么需要常量,如果不使用常量,直接在程序中填写数字或字符串,将会有什么麻烦? (1) 程序的可读性(可理解性)变差。程序员自己会忘记那些数字或字符串是什么意思,用户则更加不知它们从何处来、表示什么。 (2) 在程序的很多地方输入同样的数字或字符串,难保不发生书写错误。 (3) 如果要修改数字或字符串,则会在很多地方改动,既麻烦又容易出错。,5.2 const 与 宏常量的比较,用const来定义常量,比用 #define定义的宏常量更优越: (1)

13、 const常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查。而对后者只进行字符替换,没有类型安全检查,并且在字符替换可能会产生意料不到的错误(边际效应)。 (2) 有些集成化的调试工具可以对const常量进行调试,但是不能对宏常量进行调试。 【建议5-2-1】在C+ 程序中只使用const常量而不使用宏常量,即const常量完全取代宏常量。,5.3 常量定义建议,【建议5-3-1】需要对外公开的常量放在头文件中,不需要对外公开的常量放在定义文件的头部。为便于管理,可以把不同模块的常量集中存放在一个公共的头文件中。 【建议5-3-2】如果某一常量与其它常量密切相关,应在定

14、义中包含这种关系,而不应给出一些孤立的值。 例如: const float RADIUS = 100; const float DIAMETER = RADIUS * 2;,28,5.4 static 变量,程序存储空间可以分为三部分 static 变量 (1) 静态局部变量属于静态存储类别,在静态存储区内分配存储单元。在程序整个运行期间都不释放。 (2) 对静态局部变量是在编译时赋初值的,即只赋初值一次,在程序运行时它已有初值。以后每次调用函数时不再重新赋初值而只是保留上次函数调用结束时的值。,29,static 变量,void varfunc(); void varfunc() int v

15、ar = 0; /var 动态变量 static int static_var = 0; / static_var 静态变量 printf(40:var equal %d n,var); printf(40:static var equal %d n,static_var); printf(n); var+; static_var+; void main() int i; for(i=0;i3;i+) varfunc(); ,30,5.5 宏定义#define,宏就是字符替换 #defineAB 代替有实际意义的常量 例子: #definePI 3.1416 #define TURE 1 #d

16、efine FALSE0,宏使用的注意事项,注意宏替换后的结果是不是你想要的。 确保你知道编译器会把你的宏展开成什么样子。 【建议】如果是一个表达式,加括号。,#define abca+b+c inti,a,b,c; i = abc*3;/相当于 i=a+b+c*3 而非i=(a+b+c)*3,#define abc(a+b+c) inti,a,b,c; i = abc*3;/相当于 i=(a+b+c)*3,5.6 宏函数,#define max(a, b) (ab?a:b) int x=1, y = 3, z = 4; x = max(y, z); /相当于x= (yz?y:z); x = max(y+x, z); /相当于x= (y+xz?y+x:z);,#define max(a, b) (a)(b)?(a):(b) int x=1, y =

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > PPT模板库 > PPT素材/模板

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号