《[免费下载 c语言深度解剖[1]》

下载本书

添加书签

[免费下载 c语言深度解剖[1]- 第6部分


按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
锯)去削苹果吧。如果你真能做到,关二爷也会佩服你的。^_^。 


if、else一般表示两个分支或是嵌套表示少量的分支,但如果分支很多的话……还是用 
switch、case组合吧。其基本格式为: 


switch(variable) 


{ 


caseValue1: 


//program 
code 



break; 


caseValue2: 


//program 
code 


break; 


caseValue3: 


//program 
code 


break; 


… 


default: 


break; 




很简单,但有两个规则:

【规则 
1…19】每个 
case语句的结尾绝对不要忘了加 
break,否则将导致多个分支重叠(除非
有意使多个分支重叠)。

【规则 
1…20】最后必须使用 
default分支。即使程序真的不需要 
default处理,也应该保留
语句: 


default: 


break;

这样做并非画蛇添足,可以避免让人误以为你忘了 
default处理。

1。7。2,case关键字后面的值有什么要求吗?
好,再问问:真的就这么简单吗?看看下面的问题: 


Value1的值为 
0。1行吗?…0。1呢?…1呢?0。1+0。9呢? 
1+2呢?3/2呢?‘ 
A’呢?“A”
呢?变量 
i(假设 
i已经被初始化)呢?NULL呢?等等。这些情形希望你亲自上机调试一
下,看看到底哪些行,哪些不行。

记住:case后面只能是整型或字符型的常量或常量表达式(想想字符型数据在内存里
是怎么存的)。

1。7。3,case语句的排列顺序
似乎从来没有人考虑过这个问题,也有很多人认为 
case语句的顺序无所谓。但事实却
不是如此。如果 
case语句很少,你也许可以忽略这点,但是如果 
case语句非常多,那就不
得不好好考虑这个问题了。比如你写的是某个驱动程序,也许会经常遇到几十个 
case语句
的情况。一般来说,我们可以遵循下面的规则:


【规则 
1…21】按字母或数字顺序排列各条 
case语句。
如果所有的 
case语句没有明显的重要性差别,那就按 
A…B…C或 
1…2…3等顺序排列 
case
语句。这样做的话,你可以很容易的找到某条 
case语句。比如: 
switch(variable) 
{ 
case 
A: 
//program 
code 
break; 
case 
B: 
//program 
code 
break; 
case 
C: 
//program 
code 
break; 
… 
default: 
break; 




【规则 
1…22】把正常情况放在前面,而把异常情况放在后面。

如果有多个正常情况和异常情况,把正常情况放在前面,并做好注释;把异常情况放在
后面,同样要做注释。比如: 


switch(variable) 


{ 


/////////////////////////////////////////////////////////////////////////////////// 


//正常情况开始 


case 
A: 


//program 
code 


break; 


case 
B: 


//program 
code 


break; 


//正常情况结束 


////////////////////////////////////////////////////////////////////////////////////// 



//异常情况开始 


case 
…1: 


//program 
code 


break; 


//异常情况结束 
////////////////////////////////////////////////////////////////////////////////////// 
… 


default: 


break; 




【规则 
1…23】按执行频率排列 
case语句

把最常执行的情况放在前面,而把最不常执行的情况放在后面。最常执行的代码可能
也是调试的时候要单步执行的最多的代码。如果放在后面的话,找起来可能会比较困难,而
放在前面的话,可以很快的找到。

1。7。4,使用 
case语句的其他注意事项
【规则 
1…24】简化每种情况对应的操作。

使得与每种情况相关的代码尽可能的精炼。case语句后面的代码越精炼, 
case语句的结
果就会越清晰。你想想,如果 
case语句后面的代码整个屏幕都放不下,这样的代码谁也难
看得很清晰吧。如果某个 
case语句确实需要这么多的代码来执行某个操作,那可以把这些
操作写成一个或几个子程序,然后在 
case语句后面调用这些子程序就 
ok了。一般来说 
case
语句后面的代码尽量不要超过 
20行。

【规则 
1…25】不要为了使用 
case语句而刻意制造一个变量。 


case语句应该用于处理简单的,容易分类的数据。如果你的数据并不简单,那可能使用 
ifelseif
的组合更好一些。为了使用 
case而刻意构造出来的变量很容易把人搞糊涂,应该避免
这种变量。比如: 


charaction 
= 
a'0'; 
switch 
(action) 
{ 


case‘c’: 
fun1(); 
break; 


case‘d’: 
… 
break; 


default: 



break; 




这里控制 
case语句的变量是 
action。而 
action的值是取字符数组 
a的一个字符。但是这
种方式可能带来一些隐含的错误。一般而言,当你为了使用 
case语句而刻意去造出一个变
量时,真正的数据可能不会按照你所希望的方式映射到 
case语句里。在这个例子中,如果
用户输入字符数组 
a里面存的是“ 
const”这个字符串,那么 
case语句会匹配到第一个 
case
上,并调用 
fun1()函数。然而如果这个数组里存的是别的以字符 
c开头的任何字符串(比
如:“col”,“can”),case分支同样会匹配到第一个 
case上。但是这也许并不是你想要的结
果,这个隐含的错误往往使人抓狂。如果这样的话还不如使用 
if…elseif组合。比如: 


if(0 
 
strcmp(“const”,a)) 


{ 


fun1(); 


} 


elseif 


{ 


… 




【规则 
1…26】把 
default子句只用于检查真正的默认情况。

有时候,你只剩下了最后一种情况需要处理,于是就决定把这种情况用 
default子句来
处理。这样也许会让你偷懒少敲几个字符,但是这却很不明智。这样将失去 
case语句的标
号所提供的自说明功能,而且也丧失了使用 
default子句处理错误情况的能力。所以,奉劝
你不要偷懒,老老实实的把每一种情况都用 
case语句来完成,而把真正的默认情况的处理
交给 
default子句。

1。8,do、while、for关键字 
C语言中循环语句有三种:while循环、do…while循环、for循环。 


while循环:先判断 
while后面括号里的值,如果为真则执行其后面的代码;否则不执
行。while(1)表示死循环。死循环有没有用呢?看下面例子:

比如你开发一个系统要日夜不停的运行,但是只有操作员输入某个特定的字符‘#’才
可以停下来。 


while(1) 


{ 


if(‘#’ 
GetInputChar()) 


{ 


break; 



} 



1。8。1,break与 
continue的区别 
break关键字很重要,表示终止本层循环。现在这个例子只有一层循环,当代码执行到
break时,循环便终止。
如果把 
break换成 
continue会是什么样子呢?continue表示终止本次(本轮)循环。当
代码执行到 
continue时,本轮循环终止,进入下一轮循环。 
while(1)也有写成 
while(true)或者 
while(11)或者 
while((bool) 
1)等形式的,效果一
样。 
do…while循环:先执行 
do后面的代码,然后再判断 
while后面括号里的值,如果为真,
循环开始;否则,循环不开始。其用法与 
while循环没有区别,但相对较少用。 
for循环:for循环可以很容易的控制循环次数,多用于事先知道循环次数的情况下。
留一个问题:在 
switch 
case语句中能否使用 
continue关键字?为什么?

1。8。2,循环语句的注意点
【建议 
1…27】在多重循环中,如果有可能,应当将最长的循环放在最内层,最短的循环放
在最外层,以减少 
CPU跨切循环层的次数。

例如:

长循环在最内层,效率高长循环在最外层,效率低 
for 
(col=0; 
col
小提示:按 回车 [Enter] 键 返回书目,按 ← 键 返回上一页, 按 → 键 进入下一页。 赞一下 添加书签加入书架