深入理解C语言的逻辑控制

 更新时间:2014年07月04日 17:31:03   投稿:shichen2014  
这篇文章主要介绍了C语言的逻辑控制,对C语言的逻辑控制有较为深入的剖析,需要的朋友可以参考下

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

相关文章

  • C++实现四则运算器(无括号)

    C++实现四则运算器(无括号)

    这篇文章主要为大家详细介绍了C++实现四则运算器,无括号的计算器,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-11-11
  • 基于C++类型重定义的使用详解

    基于C++类型重定义的使用详解

    本篇文章是对C++中类型重定义的使用进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • C++获取系统时间的三种方法

    C++获取系统时间的三种方法

    在 C++ 编程中,获取系统时间是一项常见任务,无论是记录日志、计算程序运行时间,还是实现计时功能,都需要获取当前的系统时间,本文将介绍几种在 C++ 中获取系统时间的方法,并提供相应的代码示例,需要的朋友可以参考下
    2024-09-09
  • C++ Boost Bimap示例详细讲解

    C++ Boost Bimap示例详细讲解

    Boost是为C++语言标准库提供扩展的一些C++程序库的总称。Boost库是一个可移植、提供源代码的C++库,作为标准库的后备,是C++标准化进程的开发引擎之一,是为C++语言标准库提供扩展的一些C++程序库的总称
    2022-11-11
  • C语言八大排序之堆排序

    C语言八大排序之堆排序

    堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序,它的最坏,最好,平均时间复杂度均为O(nlogn),它也是不稳定排序
    2022-02-02
  • C/C++ 宏详细解析

    C/C++ 宏详细解析

    关于宏的一些语法问题,可以在google上找到。相信我,你对于宏的了解绝对没你想象的那么多。如果你还不知道#和##,也不知道prescan,那么你肯定对宏的了解不够
    2013-09-09
  • 详解C++函数模板与分离编译模式

    详解C++函数模板与分离编译模式

    这篇文章主要介绍了详解C++函数模板与分离编译模式的相关资料,帮助大家更好的理解和学习c++,感兴趣的朋友可以了解下
    2020-08-08
  • C语言链接属性的实践应用

    C语言链接属性的实践应用

    C语言中链接属性决定如何处理在不同文件中出现的标示符,下面这篇文章主要给大家介绍了关于C语言链接属性的实践应用,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2022-03-03
  • 希尔排序算法的C语言实现示例

    希尔排序算法的C语言实现示例

    这篇文章主要介绍了希尔排序算法的C语言实现示例,希尔排序可以看作为一种高级的插入排序,需要的朋友可以参考下
    2016-04-04
  • Qt图形图像开发之Qt曲线图美化QChart QScatterSeries 空心点阵图,鼠标移动到上面显示数值,鼠标移开数值消失效果实例

    Qt图形图像开发之Qt曲线图美化QChart QScatterSeries 空心点阵图,鼠标移动到上面显示数值,鼠标移开

    这篇文章主要介绍了Qt图形图像开发之Qt曲线图美化QChart QScatterSeries 空心点阵图,鼠标移动到上面显示数值,鼠标移开数值消失效果实例,需要的朋友可以参考下
    2020-03-03

最新评论