c语言位逻辑指令,深入理解C语言的逻辑控制

2014

本文对C语言的逻辑控制做一番较为深入的探讨,一般来说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语句

1

2

3

4if (条件1)

//代码块1

else

//代码块2

对应goto:

1

2

3

4

5

6

7t = 条件1;

if (t为真)goto true;

//代码块2

goto finish

true:

//代码块1

finish:

3、: 和if else是等价的。

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

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

goto版本:

1

2

3

4

5

6

7

8t = 条件1;

if (t为真)

goto true;

//变量=表达式2

goto finish;

true:

//变量=表达式1

finish:

注意::里面的表达式尽量简单,过于复杂的话,改用if语句实现,这样方便调试。

4、switch-case

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15switch (条件取值变量)

case 元素1 :

//语句块1;

break;

case 元素2:

//语句块2;

break;

...

case 元素N

//语句块N;

break;

default:

//默认处理。

break;

}

goto版本:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15跳转表={标签1,标签2,...,标签N }

goto 跳转表[元素index]

//标签1:

//语句块1

goto Finish

//标签2:

//语句块2

goto Finish

...

//标签N:

//语句块N

goto Finish

default:

//默认处理。

Finish:

5、for语句

1

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

//循环语句块

goto版本:

1

2

3

4

5

6

7

8

9//初始化语句;

if (判断语句为否)

goto Finish;

loop:

//循环语句块

//迭代语句

if (判断语句为真)

goto loop;

Finish:

6、while语句

1

2

3while(条件为真)

//代码块

//迭代块

对应goto版本:

1

2

3

4

5

6loop:

t = 条件

if (不为真)goto Finish;

//代码块

//迭代块

Finish:

7、do-while语句

1

2

3

4do {

//语句块1

//迭代块1

}while (条件为真)

goto版本:

1

2

3

4loop:

//语句块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 强烈推荐在写代码前,在纸上画完整的流程图,梳理自己的设计思路。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值