深入理解C语言-06-逻辑控制

C语言的逻辑控制主要有7种:

1> goto 最强大,但一般只在特殊环境下使用。

2> if else

3> ?:

4> switch case

5> for

6> while

7> do while


自从dijkstra的论文Go To Statement Considered Harmful以后,C语言代码很少看到goto了。(一般用在多次资源分配的错误处理上)

但,从计算机的角度来说,缺少goto(jmp指令)还真没法干活。其实,goto是最符合我们的设计流程图的。

将一个流程图用goto来实现也最直观。goto能真正让我们做到心之所动,剑之所至。


接下来,分别考虑将2-7转化为对应的goto语言版本(等价于转化为对应汇编版本)。

2 if语句

if (条件1)

代码块1

else 

代码块2

对应goto:

t = 条件1;

if (t为真)goto true;

代码块2

goto finish

true:

    代码块1

finish:


3 ?: 和if else是等价的。

只不过if语句为代码块,?:为表达式。

变量= (条件1)? 表达式1:表达式2;

goto版本:

t = 条件1;

if (t为真)

goto true;

变量=表达式2

goto finish;

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

goto Finish

标签2:

   语句块2

goto Finish

...

标签N:

   语句块N

goto Finish

default:

默认处理。

Finish:

5> for

for (初始化语句;判断语句;迭代语句)

循环语句块

goto版本:

初始化语句;

if (判断语句为否)

goto Finish;

loop:

循环语句块

迭代语句

if (判断语句为真)

goto loop;

Finish:

6> while

while(条件为真)

代码块

迭代块

对应goto版本:

loop:

t = 条件

if (不为真) goto Finish;

代码块

迭代块

Finish:

7> do-while

do {

语句块1

迭代块1

} while (条件为真)

goto版本:

loop:

语句块1

迭代块1

if (条件为真) goto loop;

C语言的goto同汇编语句jmp系列指令逻辑上是完全一致的。


注意:

1> 关于条件,有个经典的逻辑代数公式:

摩根公式:

!(A && B) = (!A) || (!B)

建议,对复杂逻辑,手动画代数运算表

A B 结果

0 0 ?

0 1 ?

1 0 ?

1 1 ?

并保证单体测试的全覆盖。

2> 逻辑操作和位操作是2组,需要区分开来。

 与 或 反

逻辑: && || !

位: & | ~ ^ (异或)

3 强烈推荐在写代码前,在纸上画完整的流程图,梳理自己的设计思路。

你可能感兴趣的:(C语言,逻辑控制)