本文对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) //代码块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 强烈推荐在写代码前,在纸上画完整的流程图,梳理自己的设计思路。
有人知道为什么这个循环总是针对不同于1或0的值,以及如何避免在输入字符时出现无休止的循环吗? }
主要内容:逻辑运算的结果,优先级现在假设有这样一种情况,我们的软件比较特殊,要求使用者必须成年,并且成绩大于等于60,该怎么办呢? 或许你会想到使用嵌套的 if 语句,类似下面这样的代码: 这种方法虽然能够行得通,但不够简洁和专业,我们可以将其压缩为一条 if else 语句: 是一个新的运算符,称为 逻辑运算符,表示 和 两个条件必须同时成立才能执行 if 后面的代码,否则就执行 else 后面的代码。 在高中数学中,我们就学
本文向大家介绍深入了解Mysql逻辑架构,包括了深入了解Mysql逻辑架构的使用技巧和注意事项,需要的朋友参考一下 Mysql现在是大多数公司企业在用的数据库,之所以用Mysql,一点是因为Mysql是开源软件,一些有能力的公司会基于已有的Mysql架构,进行修改、调整改成适合自己公司的业务需要。 一点是因为Mysql免费,相对昂贵的Oracle服务,对于很多刚起步的公司来说,是最适合不过的数
在之前的 C 语言标准中,逻辑运算符是表示两个数值之间逻辑关系的运算符。通常用 0 和 1 来表示假值和真值。但是在 C 语言中会认为非 0 的数值在逻辑运算中都为 1 。逻辑运算的返回值也是整数型,不是 0 就是 1 ,这点和其他很多编程语言是不同的。 但是,在 C99 标准中引入了布尔类型。所以 C 语言中的逻辑运算就简单了很多。要想使用布尔类型,需要引入 stdbool.h 这个库即可。但是
指针逻辑运算符操作 指针变量存储的是一个地址,可以将它理解成一个数值。只是编译器会因为它是一个指针类型而将它读取作为一个地址。逻辑运算符包括>=,<=,==,!=;显然我们比较两个地址的数值的大小是没有意义的。 指针中最常用的逻辑操作符==,!=这两个是最常用的。 我们将0x0规定为地址的无效值,结束标志。NULL就是一个在C编译器中一个被定义好了的宏,它代表了这个无效地址。我们经常使用p==NU
本文向大家介绍深入理解Swift语言中的闭包机制,包括了深入理解Swift语言中的闭包机制的使用技巧和注意事项,需要的朋友参考一下 在 Swift 中的闭包类似于结构块,并可以在任何地方调用,它就像 C 和 Objective C 语言内置的函数。 函数内部定义的常数和变量引用可被捕获并存储在闭包。函数被视为封闭的特殊情况,它有 3 种形式。 在 Swift 语言闭合表达式,如下优化,重量轻语法风