流程控制

计算机运算领域的用语

控制流程(也称为流程控制)是计算机运算领域的用语,意指在程序运行时,个别的指令(或是陈述、子程序)运行或求值的顺序。不论是在声明式编程语言或是函数编程语言中,都有类似的概念。

基本概念
在声明式的编程语言中,流程控制指令是指会改变程序运行顺序的指令,可能是运行不同位置的指令,或是在二段(或多段)程序中选择一个运行。
不同的编程语言所提供的流程控制指令也会随之不同,但一般可以分为以下四种:
中断以及Unix系统中的信号等较低级的机制也可以造成类似子程序的效果,不过通常这类机制会用来回应外部的事件或是输入。程序自修改因为其对代码的影响,也会影响控制流程,但多半不会有明显的流程控制指令。
机器语言汇编语言中,流程控制是借由修改程序计数器数值来达到。一些中央处理器只支持条件分支(branch)或是无条件分支(有时会称为jump)。
标记
标记是一个标示在源代码固定位置中的名称或数字,其他位置的流程控制指令可以参考标记的位置,运行标记位置所对应的程序。标记本身不影响程序的进行,除了标示位置外,对程序运行没有其他的作用。
有一些编程语言(像Fortran及BASIC等)利用行号作为标记。行号是标示在每一行程序最前面的自然数,不一定要是连续的数字,在不受流程控制指令影响的情形下,程序会从最小的行号依序运行,而流程控制指令需指定对应的行号。以下是一个BASIC的例子:
在像是C及Ada等编程语言中,标记是一个标识符,一般出现在一行的最前面,后面会加一个冒号作为识别,以下是C语言的例子:
Algol 60语言同时支持整数(类似行号)及标识符的标记(二者后面都要加上冒号),不过其他Algol语言几乎都不支持整数的标记。
Goto
goto 指令(来自英文go和to的组合)是无条件流程控制指令中最基本的型式。一般在程序中会用以下的方式出现(指令大小写可能会依编程语言而不同)
goto 指令的效果是调整程序的控制流程,后续就运行标记位置的程序。
goto 指令是许多的计算机科学家视为有害(considered harmful)的指令,例如Edsger Wybe Dijkstra提出了goto有害论。
子程序
子程序(subroutine)可以用许多不同的术语来表示,例如程序、函数(尤其是有传回值时)或是方法(特别是子程序属于一个类的一部份)等。
子程序是是完成一项特定工作的代码串行,其他程序可以将流程移转到子程序中,运行特定工作后再回到原来的程序,若程序中有许多部份都需要运行一特定工作,利用子程序的方式可以利用一段程序达到上述的功能,可以减少代码的长度。
如今子程序也常用来使得程序更加的结构化,例如可以将一些特殊的算法或特殊的数据访问方式放在子程序中,和其他代码隔离。子程序也是程序模块的一种,若许多程序员共同开发一个程序,子程序也有助于其工作的分区及分工。
控制流程
1966 年5月Corrado Böhm及Giuseppe Jacopini在《Communications of the ACM》发表论文,说明任何一个有goto指令的程序,可以改为完全不使用goto指令的程序,goto指令可以用选择指令(IF THEN ELSE)及循环(WHILE 特定条件 DO 特定程序)取代,可能会再多一些重复的代码及额外的布林变量。后来的研究者已证明选择指令也可以用循环取代,不过需要更多的布林变量。Böhm及 Jacopini的论文说明程序可以完全不使用goto,但是在实务上大家不一定会想要这么进行。
其他的研究说明若控制结构只有一个进入点(entry)及一个退出点(exit),这样的程序会比其他型式的程序容易理解。因此这样的程序可以像一个指令一样放在程序的任何部份,不必担心会破坏其结构,换句话说,这种程序是“可组成的”(composable)。
控制结构
若一编程语言支持控制结构,控制结构开始时多半都会有特定的关键字,以标明是使用哪一种控制结构。但只有部份编程语言在控制结构退出时会有特定的关键字表示退出,因此可以依控制结构退出时是否有特定关键字来将编程语言分为二类。
有特定关键字的语言:Ada、Algol 68、 Modula-2(Modula-2)、Fortran 77、Visual Basic,使用的特定关键字依编程语言而不同:
条件判断
条件判断是依指定变量或表达式的结果,决定后续运行的程序,最常用的是if-else指令,可以根据指定条件是否成立,决定后续的程序。也可以组合多个if-else指令,进行较复杂的条件判断。 许多编程语言也提供多选一的条件判断,例如C语言的switch-case指令。
循环
循环是指一段在程序中只出现一次,但可能会连续运行多次的代码。常见的循环可以分为二种,指定运行次数的循环(如C语言的for循环)以及指定继续运行条件(或停止条件)的循环(如C语言的while循环)。
在一些函数编程语言(例如HaskellScheme)中会使用递归不动点组合子来达到循环的效果,其中尾部递归是一种特别的递归,很容易转换为迭代。
非区部控制流程
有些编程语言会提供非区部的控制流程(non-local control flow),会允许流程跳出目前的代码,进入一段事先指定的代码。常用的结构化非区部控制流程可分为条件处理(condition)、异常处理及延续性(Continuation)三种。
条件处理
PL/I编程语言中有22种标准的条件(如 ZERODIVIDE SUBSCRIPTRANGE ENDFILE),可以在程序中设置,当特定条件成立时需进行的指令,程序设计者也可以定义自己的条件,并在程序中使用。
条件成立时,只能设置一个需进行的指令(类似未结构化的if指令),大部份的应用中,都会指定运行goto指令,跳到其他代码运行对应的流程。
不过因为有些条件处理的实现会增加许多代码及运行时间(特别SUBSCRIPTRANGE),所以许多程序设计者会尽量不使用条件处理。
条件处理的语法如下:
ON 条件 GOTO label
异常处理
有些编程语言可提供不需要使用GOTO的结构化异常处理程序:
在try{...}的区块中,若 有异常情形时,程序就会离开try的区块,由后续的一个或多个catch子句判断需运行何种异常处理。在D、Java、C#及Python编程语言 中,try{...}区块中还可以加入一个finally子句,不管程序流程是否离开try{...}区块,finally子句中的程序都一定会运行,常 用在当程序退出处理时,需要放弃一些外部资源(文件或数据库链接)的情形下:
由于上述情形相当普遍,C#提供一种特殊的语法进行相同的处理:
只要离开 using区块,编译器会自动释放stm对象,Python的 with指令及也有类似的功能。
这些语言都有定义标准的异常情形及其出现的条件,程序设计者也可以丢出自己产生的异常(其实C++及Python的throw和catch支持绝大多数形态的对象)。
若某一个throw指令找不到对应的catch,控制流程会离开目前的副程序或控制结构,设法找到对应的catch,若到主程序的结尾还是找不到对应的catch,程序会强制退出,并显示适当的错误信息。
延续性
延续性(Continuation)可以将目前子程序的运行状态(包括目前的堆栈,区部变量及运行到的位置)存储成一个对象,后续在其他子程序中可以利用此对象回到此子程序现在的运行状态。
延续性一词也可以指第一类延续性(first-class continuation),是指编程语言可以在任意时间点存储目前的运行状态,并在之后回到之前存储的运行状态。
程序需要分配空间给子程序用到的区域变量,而且在子程序退出时需发布这些变量用到的空间。许多编程语言利用调用堆栈来存放这些变量,可以简单快速的分配及发布空间。也有一些编程语言使用动态存储器分配来存储变量,可以较灵活的分配变量,但分配及发布空间较不方便。这二个架构下延续性的处理方式也会不同,各有其优点及缺点。
Scheme语言利用call-with-current-continuation函数(缩写为call/cc) 可提供延续性功能。
全国各地天气预报查询

上海市

  • 市辖区
  • 云南省

  • 临沧市
  • 云南省

  • 丽江市
  • 云南省

  • 保山市
  • 云南省

  • 大理白族自治州
  • 云南省

  • 德宏傣族景颇族自治州
  • 云南省

  • 怒江傈僳族自治州
  • 云南省

  • 文山壮族苗族自治州
  • 云南省

  • 昆明市
  • 云南省

  • 昭通市
  • 云南省

  • 普洱市
  • 云南省

  • 曲靖市
  • 云南省

  • 楚雄彝族自治州
  • 云南省

  • 玉溪市
  • 云南省

  • 红河哈尼族彝族自治州
  • 云南省

  • 西双版纳傣族自治州
  • 云南省

  • 迪庆藏族自治州
  • 内蒙古自治区

  • 乌兰察布市
  • 内蒙古自治区

  • 乌海市
  • 内蒙古自治区

  • 兴安盟
  • 内蒙古自治区

  • 包头市
  • 内蒙古自治区

  • 呼伦贝尔市
  • 内蒙古自治区

  • 呼和浩特市
  • 内蒙古自治区

  • 巴彦淖尔市
  • 内蒙古自治区

  • 赤峰市
  • 内蒙古自治区

  • 通辽市
  • 内蒙古自治区

  • 鄂尔多斯市
  • 内蒙古自治区

  • 锡林郭勒盟
  • 内蒙古自治区

  • 阿拉善盟
  • 北京市

  • 市辖区
  • 吉林省

  • 吉林市
  • 吉林省

  • 四平市
  • 吉林省

  • 延边朝鲜族自治州
  • 吉林省

  • 松原市
  • 吉林省

  • 白城市
  • 吉林省

  • 白山市
  • 吉林省

  • 辽源市
  • 吉林省

  • 通化市
  • 吉林省

  • 长春市
  • 四川省

  • 乐山市
  • 四川省

  • 内江市
  • 四川省

  • 凉山彝族自治州
  • 四川省

  • 南充市
  • 四川省

  • 宜宾市
  • 四川省

  • 巴中市
  • 四川省

  • 广元市
  • 四川省

  • 广安市
  • 四川省

  • 德阳市
  • 四川省

  • 成都市
  • 四川省

  • 攀枝花市
  • 四川省

  • 泸州市
  • 四川省

  • 甘孜藏族自治州
  • 四川省

  • 眉山市
  • 四川省

  • 绵阳市
  • 四川省

  • 自贡市
  • 四川省

  • 资阳市
  • 四川省

  • 达州市
  • 四川省

  • 遂宁市
  • 四川省

  • 阿坝藏族羌族自治州
  • 四川省

  • 雅安市
  • 天津市

  • 市辖区
  • 宁夏回族自治区

  • 中卫市
  • 宁夏回族自治区

  • 吴忠市
  • 宁夏回族自治区

  • 固原市
  • 宁夏回族自治区

  • 石嘴山市
  • 宁夏回族自治区

  • 银川市
  • 安徽省

  • 亳州市
  • 安徽省

  • 六安市
  • 安徽省

  • 合肥市
  • 安徽省

  • 安庆市
  • 安徽省

  • 宣城市
  • 安徽省

  • 宿州市
  • 安徽省

  • 池州市
  • 安徽省

  • 淮北市
  • 安徽省

  • 淮南市
  • 安徽省

  • 滁州市
  • 安徽省

  • 芜湖市
  • 安徽省

  • 蚌埠市
  • 安徽省

  • 铜陵市
  • 安徽省

  • 阜阳市
  • 安徽省

  • 马鞍山市
  • 安徽省

  • 黄山市
  • 山东省

  • 东营市
  • 山东省

  • 临沂市
  • 山东省

  • 威海市
  • 山东省

  • 德州市
  • 山东省

  • 日照市
  • 山东省

  • 枣庄市
  • 山东省

  • 泰安市
  • 山东省

  • 济南市
  • 山东省

  • 济宁市
  • 山东省

  • 淄博市
  • 山东省

  • 滨州市
  • 山东省

  • 潍坊市
  • 山东省

  • 烟台市
  • 山东省

  • 聊城市
  • 山东省

  • 菏泽市
  • 山东省

  • 青岛市
  • 山西省

  • 临汾市
  • 山西省

  • 吕梁市
  • 山西省

  • 大同市
  • 山西省

  • 太原市
  • 山西省

  • 忻州市
  • 山西省

  • 晋中市
  • 山西省

  • 晋城市
  • 山西省

  • 朔州市
  • 山西省

  • 运城市
  • 山西省

  • 长治市
  • 山西省

  • 阳泉市
  • 广东省

  • 东莞市
  • 广东省

  • 中山市
  • 广东省

  • 云浮市
  • 广东省

  • 佛山市
  • 广东省

  • 广州市
  • 广东省

  • 惠州市
  • 广东省

  • 揭阳市
  • 广东省

  • 梅州市
  • 广东省

  • 汕头市
  • 广东省

  • 汕尾市
  • 广东省

  • 江门市
  • 广东省

  • 河源市
  • 广东省

  • 深圳市
  • 广东省

  • 清远市
  • 广东省

  • 湛江市
  • 广东省

  • 潮州市
  • 广东省

  • 珠海市
  • 广东省

  • 肇庆市
  • 广东省

  • 茂名市
  • 广东省

  • 阳江市
  • 广东省

  • 韶关市
  • 广西壮族自治区

  • 北海市
  • 广西壮族自治区

  • 南宁市
  • 广西壮族自治区

  • 崇左市
  • 广西壮族自治区

  • 来宾市
  • 广西壮族自治区

  • 柳州市
  • 广西壮族自治区

  • 桂林市
  • 广西壮族自治区

  • 梧州市
  • 广西壮族自治区

  • 河池市
  • 广西壮族自治区

  • 玉林市
  • 广西壮族自治区

  • 百色市
  • 广西壮族自治区

  • 贵港市
  • 广西壮族自治区

  • 贺州市
  • 广西壮族自治区

  • 钦州市
  • 广西壮族自治区

  • 防城港市
  • 新疆维吾尔自治区

  • 乌鲁木齐市
  • 新疆维吾尔自治区

  • 伊犁哈萨克自治州
  • 新疆维吾尔自治区

  • 克孜勒苏柯尔克孜自治州
  • 新疆维吾尔自治区

  • 克拉玛依市
  • 新疆维吾尔自治区

  • 博尔塔拉蒙古自治州
  • 新疆维吾尔自治区

  • 吐鲁番市
  • 新疆维吾尔自治区

  • 和田地区
  • 新疆维吾尔自治区

  • 哈密市
  • 新疆维吾尔自治区

  • 喀什地区
  • 新疆维吾尔自治区

  • 塔城地区
  • 新疆维吾尔自治区

  • 巴音郭楞蒙古自治州
  • 新疆维吾尔自治区

  • 昌吉回族自治州
  • 新疆维吾尔自治区

  • 自治区直辖县级行政区划
  • 新疆维吾尔自治区

  • 阿克苏地区
  • 新疆维吾尔自治区

  • 阿勒泰地区
  • 江苏省

  • 南京市
  • 江苏省

  • 南通市
  • 江苏省

  • 宿迁市
  • 江苏省

  • 常州市
  • 江苏省

  • 徐州市
  • 江苏省

  • 扬州市
  • 江苏省

  • 无锡市
  • 江苏省

  • 泰州市
  • 江苏省

  • 淮安市
  • 江苏省

  • 盐城市
  • 江苏省

  • 苏州市
  • 江苏省

  • 连云港市
  • 江苏省

  • 镇江市
  • 江西省

  • 上饶市
  • 江西省

  • 九江市
  • 江西省

  • 南昌市
  • 江西省

  • 吉安市
  • 江西省

  • 宜春市
  • 江西省

  • 抚州市
  • 江西省

  • 新余市
  • 江西省

  • 景德镇市
  • 江西省

  • 萍乡市
  • 江西省

  • 赣州市
  • 江西省

  • 鹰潭市
  • 河北省

  • 保定市
  • 河北省

  • 唐山市
  • 河北省

  • 廊坊市
  • 河北省

  • 张家口市
  • 河北省

  • 承德市
  • 河北省

  • 沧州市
  • 河北省

  • 石家庄市
  • 河北省

  • 秦皇岛市
  • 河北省

  • 衡水市
  • 河北省

  • 邢台市
  • 河北省

  • 邯郸市
  • 河南省

  • 三门峡市
  • 河南省

  • 信阳市
  • 河南省

  • 南阳市
  • 河南省

  • 周口市
  • 河南省

  • 商丘市
  • 河南省

  • 安阳市
  • 河南省

  • 平顶山市
  • 河南省

  • 开封市
  • 河南省

  • 新乡市
  • 河南省

  • 洛阳市
  • 河南省

  • 漯河市
  • 河南省

  • 濮阳市
  • 河南省

  • 焦作市
  • 河南省

  • 省直辖县级行政区划
  • 河南省

  • 许昌市
  • 河南省

  • 郑州市
  • 河南省

  • 驻马店市
  • 河南省

  • 鹤壁市
  • 浙江省

  • 丽水市
  • 浙江省

  • 台州市
  • 浙江省

  • 嘉兴市
  • 浙江省

  • 宁波市
  • 浙江省

  • 杭州市
  • 浙江省

  • 温州市
  • 浙江省

  • 湖州市
  • 浙江省

  • 绍兴市
  • 浙江省

  • 舟山市
  • 浙江省

  • 衢州市
  • 浙江省

  • 金华市
  • 海南省

  • 三亚市
  • 海南省

  • 三沙市
  • 海南省

  • 儋州市
  • 海南省

  • 海口市
  • 海南省

  • 省直辖县级行政区划
  • 湖北省

  • 十堰市
  • 湖北省

  • 咸宁市
  • 湖北省

  • 孝感市
  • 湖北省

  • 宜昌市
  • 湖北省

  • 恩施土家族苗族自治州
  • 湖北省

  • 武汉市
  • 湖北省

  • 省直辖县级行政区划
  • 湖北省

  • 荆州市
  • 湖北省

  • 荆门市
  • 湖北省

  • 襄阳市
  • 湖北省

  • 鄂州市
  • 湖北省

  • 随州市
  • 湖北省

  • 黄冈市
  • 湖北省

  • 黄石市
  • 湖南省

  • 娄底市
  • 湖南省

  • 岳阳市
  • 湖南省

  • 常德市
  • 湖南省

  • 张家界市
  • 湖南省

  • 怀化市
  • 湖南省

  • 株洲市
  • 湖南省

  • 永州市
  • 湖南省

  • 湘潭市
  • 湖南省

  • 湘西土家族苗族自治州
  • 湖南省

  • 益阳市
  • 湖南省

  • 衡阳市
  • 湖南省

  • 邵阳市
  • 湖南省

  • 郴州市
  • 湖南省

  • 长沙市
  • 甘肃省

  • 临夏回族自治州
  • 甘肃省

  • 兰州市
  • 甘肃省

  • 嘉峪关市
  • 甘肃省

  • 天水市
  • 甘肃省

  • 定西市
  • 甘肃省

  • 平凉市
  • 甘肃省

  • 庆阳市
  • 甘肃省

  • 张掖市
  • 甘肃省

  • 武威市
  • 甘肃省

  • 甘南藏族自治州
  • 甘肃省

  • 白银市
  • 甘肃省

  • 酒泉市
  • 甘肃省

  • 金昌市
  • 甘肃省

  • 陇南市
  • 福建省

  • 三明市
  • 福建省

  • 南平市
  • 福建省

  • 厦门市
  • 福建省

  • 宁德市
  • 福建省

  • 泉州市
  • 福建省

  • 漳州市
  • 福建省

  • 福州市
  • 福建省

  • 莆田市
  • 福建省

  • 龙岩市
  • 西藏自治区

  • 山南市
  • 西藏自治区

  • 拉萨市
  • 西藏自治区

  • 日喀则市
  • 西藏自治区

  • 昌都市
  • 西藏自治区

  • 林芝市
  • 西藏自治区

  • 那曲市
  • 西藏自治区

  • 阿里地区
  • 贵州省

  • 六盘水市
  • 贵州省

  • 安顺市
  • 贵州省

  • 毕节市
  • 贵州省

  • 贵阳市
  • 贵州省

  • 遵义市
  • 贵州省

  • 铜仁市
  • 贵州省

  • 黔东南苗族侗族自治州
  • 贵州省

  • 黔南布依族苗族自治州
  • 贵州省

  • 黔西南布依族苗族自治州
  • 辽宁省

  • 丹东市
  • 辽宁省

  • 大连市
  • 辽宁省

  • 抚顺市
  • 辽宁省

  • 朝阳市
  • 辽宁省

  • 本溪市
  • 辽宁省

  • 沈阳市
  • 辽宁省

  • 盘锦市
  • 辽宁省

  • 营口市
  • 辽宁省

  • 葫芦岛市
  • 辽宁省

  • 辽阳市
  • 辽宁省

  • 铁岭市
  • 辽宁省

  • 锦州市
  • 辽宁省

  • 阜新市
  • 辽宁省

  • 鞍山市
  • 重庆市

  • 重庆市

  • 市辖区
  • 陕西省

  • 咸阳市
  • 陕西省

  • 商洛市
  • 陕西省

  • 安康市
  • 陕西省

  • 宝鸡市
  • 陕西省

  • 延安市
  • 陕西省

  • 榆林市
  • 陕西省

  • 汉中市
  • 陕西省

  • 渭南市
  • 陕西省

  • 西安市
  • 陕西省

  • 铜川市
  • 青海省

  • 果洛藏族自治州
  • 青海省

  • 海东市
  • 青海省

  • 海北藏族自治州
  • 青海省

  • 海南藏族自治州
  • 青海省

  • 海西蒙古族藏族自治州
  • 青海省

  • 玉树藏族自治州
  • 青海省

  • 西宁市
  • 青海省

  • 黄南藏族自治州
  • 黑龙江省

  • 七台河市
  • 黑龙江省

  • 伊春市
  • 黑龙江省

  • 佳木斯市
  • 黑龙江省

  • 双鸭山市
  • 黑龙江省

  • 哈尔滨市
  • 黑龙江省

  • 大兴安岭地区
  • 黑龙江省

  • 大庆市
  • 黑龙江省

  • 牡丹江市
  • 黑龙江省

  • 绥化市
  • 黑龙江省

  • 鸡西市
  • 黑龙江省

  • 鹤岗市
  • 黑龙江省

  • 黑河市
  • 黑龙江省

  • 齐齐哈尔市