时间:2021-05-19
本文对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语句
if (条件1)//代码块1else//代码块2对应goto:
t = 条件1;if (t为真)goto true;//代码块2goto finishtrue://代码块1finish:3、?: 和if else是等价的。
只不过if语句为代码块,?:为表达式。
goto版本:
t = 条件1;if (t为真)goto true;//变量=表达式2goto finish;true://变量=表达式1finish:注意:?:里面的表达式尽量简单,过于复杂的话,改用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://语句块1goto Finish//标签2://语句块2goto Finish...//标签N://语句块Ngoto Finishdefault://默认处理。Finish:5、for语句
for (初始化语句;判断语句;迭代语句)//循环语句块goto版本:
//初始化语句;if (判断语句为否)goto Finish;loop://循环语句块//迭代语句if (判断语句为真)goto loop;Finish:6、while语句
while(条件为真)//代码块//迭代块对应goto版本:
7、do-while语句
do {//语句块1//迭代块1} while (条件为真)goto版本:
C语言的goto同汇编语句jmp系列指令逻辑上是完全一致的。
注意:
1、 关于条件,有个经典的逻辑代数公式:
摩根公式:
!(A && B) = (!A) || (!B)
建议,对复杂逻辑,手动画代数运算表
A B 结果
0 0 ?
0 1 ?
1 0 ?
1 1 ?
并保证单体测试的全覆盖。
2、 逻辑操作和位操作是2组,需要区分开来。
与 或 反
逻辑: && || !
位: & | ~ ^ (异或)
3 强烈推荐在写代码前,在纸上画完整的流程图,梳理自己的设计思路。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
扩展阅读c#基础系列1---深入理解值类型和引用类型c#基础系列2---深入理解String引言在上篇文章深入理解值类型和引用类型的时候,有的小伙伴就推荐说一说
指针是C语言的精髓,本文就以实例的形式详细分析了C语言的长度和类型。对于初学者深入理解C语言程序设计有很好的参考价值。具体分析如下:一般来说,如果考虑应用程序的
本文以实例形式讲述了C#泛型的用法,有助于读者深入理解C#泛型的原理,具体分析如下:首先需要明白什么时候使用泛型:当针对不同的数据类型,采用相似的逻辑算法,为了
首先看我们的源代码。复制代码代码如下:深入理解Javascriptconsole.log(this);深入理解Javascript我们知道,通过浏览器打开这个页
Java内省(Introspector)深入理解一些概念: 内省(Introspector)是Java语言对JavaBean类属性、事件的一种缺省处理方法。