深入理解C语言的逻辑控制
本文对C语言的逻辑控制做一番较为深入的探讨,一般来说C语言的逻辑控制语句主要有如下的7种:
1、goto最强大,但一般只在特殊环境下使用。
2、ifelse
3、?:
4、switchcase
5、for
6、while
7、dowhile
自从dijkstra的论文GoToStatementConsideredHarmful以后,C语言代码很少看到goto了。(一般用在多次资源分配的错误处理上)
但,从计算机的角度来说,缺少goto(jmp指令)还真没法干活。其实,goto是最符合我们的设计流程图的。
将一个流程图用goto来实现也最直观。goto能真正让我们做到心之所动,剑之所至。
接下来,分别考虑将2-7转化为对应的goto语言版本(等价于转化为对应汇编版本)。
2、if语句
if(条件1) //代码块1 else //代码块2
对应goto:
t=条件1; if(t为真)gototrue; //代码块2 gotofinish true: //代码块1 finish:
3、?:和ifelse是等价的。
只不过if语句为代码块,?:为表达式。
变量=(条件1)?表达式1:表达式2;
goto版本:
t=条件1; if(t为真) gototrue; //变量=表达式2 gotofinish; true: //变量=表达式1 finish:
注意:?:里面的表达式尽量简单,过于复杂的话,改用if语句实现,这样方便调试。
4、switch-case
switch(条件取值变量) case元素1: //语句块1; break; case元素2: //语句块2; break; ... case元素N //语句块N; break; default: //默认处理。 break; }
goto版本:
跳转表={标签1,标签2,...,标签N} goto跳转表[元素index] //标签1: //语句块1 gotoFinish //标签2: //语句块2 gotoFinish ... //标签N: //语句块N gotoFinish default: //默认处理。 Finish:
5、for语句
for(初始化语句;判断语句;迭代语句) //循环语句块
goto版本:
//初始化语句; if(判断语句为否) gotoFinish; loop: //循环语句块 //迭代语句 if(判断语句为真) gotoloop; Finish:
6、while语句
while(条件为真) //代码块 //迭代块
对应goto版本:
loop: t=条件 if(不为真)gotoFinish; //代码块 //迭代块 Finish:
7、do-while语句
do{ //语句块1 //迭代块1 }while(条件为真)
goto版本:
loop: //语句块1 //迭代块1 if(条件为真)gotoloop;
C语言的goto同汇编语句jmp系列指令逻辑上是完全一致的。
注意:
1、关于条件,有个经典的逻辑代数公式:
摩根公式:
!(A&&B)=(!A)||(!B)
建议,对复杂逻辑,手动画代数运算表
AB结果
00?
01?
10?
11?
并保证单体测试的全覆盖。
2、逻辑操作和位操作是2组,需要区分开来。
与或反
逻辑:&&||!
位:&|~^(异或)
3强烈推荐在写代码前,在纸上画完整的流程图,梳理自己的设计思路。