当前课程知识点:C语言程序设计(上) > 选择结构的程序设计 > 3.5 GOTO的适当使用 > 3.5 GOTO的适当使用
下面我们讨论一下goto
goto为什么要单独拿出来
它就是一个简单的语句
要单独拿出来做一些讨论
是因为这个goto
通常是个有争议的
有的人觉得它特别好使
有的人觉得它简直不能用
那为什么会这样呢
我们先看一下它怎么用
然后呢 它在哪里用
然后我们再讨论它能不能用
goto是这样
很简单就一句话
goto没条件
这里有条件吗 没条件
goto到说到哪里去
把你要去的地方说清楚
我就直接可以去了
那你要去的地方
当然在你的程序里边必须有
goto到你的一个记号
我到了这个记号
无所不能去这是它的优势
它都能去
那就说它的功能无条件的转向
你那标号所指定的地方
比如说我们看个例子
这是一个非常简单的例子
就是我们从键盘上录入字
录入这一行字符到底多少个你数数看
这个程序怎么写呢
我们看前面定义了n
那这n里边是什么东西呢
n我们来做一个计数器
我这一行到底敲了几个字符
在这里边
说给我提个醒
说你输入一个字符
输入一个字符串string
输入一个字符串
那我就在这开始输入
如果 大家看我怎么输入呢
如果我们条件里边给的是什么
大家还记不记得这个getchar的功能
getchar是从键盘上获取一个字符
就你从键盘上敲一个字
屏幕上给你显示出来
并且你要回车
你要敲一下回车
这个字才真的进去了
那这是一个C的内部函数
从键盘上获取一个键值
获取一个键
你敲进来的这个东西
不是斜杠n
斜杠n是什么
斜杠n不就是回车吗
你敲进来这个东西是不拐弯吗
不到另一个新的行上去吗
如果是的话
就说你不到另一个行上去
还在这一行我就要给你计数了
你要到了另一行上
那说明这一行敲完了
我就不计数了
所以就是说你每敲进来一个字符
我问你 你不换行吗
不换行就计数
如果你不换行
这个条件就叫做 你不换行吗
不换行就是真的
如果你不换行
计数器加1
自增一次
自增完了到哪去了呢
goto loop
loop在哪
在这儿
自增完了什么条件都没有
你就给我无条件的
转回到loop的这个地方
这个地方又开始做 说
你再从键盘上敲一个字
然后我问你你敲的那个是要换行吗
那当然
你如果需要换行你必须敲一个斜杠n
那就表示这行
录入完了我不给你数数了
否则它一直给你数着数
看你这一行一共敲了多少个字符
这里边用到了goto
我们没有把goto涂成红色
我们把loop涂成了红色
是因为它比goto都重要
是因为
它是要goto到达的地方
如果你说loop
你写了一个loop
你这却忘了
程序在你这个
整个的流程里边找不到一个loop
那goto就没法去了
这程序就走不通了
这是一种可能
还有一种可能是
loop本来是要到这
你却把它写到上面这一行上
写错了
那它就去错了
它就去到了
说再提示你
来输入一个什么什么input a string
你就错了
所以大家明确了吗
为什么要有争议
争议就是它太容易出错了
它太容易出错了就说
有可能是loop写不对地方
有可能是你忘了写了
比如说你这个程序里有很多个goto
你会有很多个标记
这几个标记会不会弄乱
那第二个问题是说
它太容易啦
它哪都能去
它说loop到哪里
它说goto到哪里就到哪里
那这样的话
它可以goto在这
它也可以goto的出去
它也可以goto到这
那整个如果程序长了
一旦我程序走不通的时候
咱就goto
goto到那边
那个地方在走走走走走
走不通的时候再拿goto回来
goto在这个地方
大家平常把这个叫什么程序
面条程序
搅成一团了
后边
这给谁造成了困难
也许你搅成一团你这程序走完了
结果是正确的
是走的通的
但是读程序的人
读不懂很乱
将来要维护你这个程序的人
如果你做了一个软件
你软件里都是这样跳来跳去的
这个软件维护起来就是相当的困难
所以争议就在于说
它最主要的负面影响是什么
它使程序的可读性变的极差
甚至是没法维护它
就是面条程序面条代码
如果我们适当的使用
它是不就一定都是那么恶略的影响
那可不一定
有时候
它能使代码的质量提高很多
执行效率提高很多
比如说给大家一个简单的程序
这是循环
循环我们还没有讲
下边我们会讨论循环的问题
这块我们看
一层循环两层循环三层循环
如果你没学过的话
没有关系
你只要知道这是
一层两层很多层循环
如果在这个循环题里边
做到某一个程度
我已经达到了我的目标
我直接可以goto out
out到哪里
我直接不用说
到了第二层
再到上一层
第一层再出来
我直接可以goto出来
否则的话这个循环结束是
先回到上一层
再回到它的上一层
它才能跳出来
所以这样的话就是
程序的效率提高很多
所以我们是说
不提倡使用goto
但是偶尔在特别需要的地方
用一下
但是我们并不提倡使用
因为C给你的结构化语句
就是它的语句
支持结构化的程序设计
已经是相当好了
没有goto完全不受影响
-1.1 计算机的问题求解方法
--讨论题:数学模型
-1.1 计算机的问题求解方法--作业
-1.2 C语言与C程序
--讨论题:运算符
-1.3 C语言处理系统与程序调试运行
--例程
-1.4 程序中的人机交互
--例程
--作业讨论区
-2.1 算术运算的C程序实现
--算术混合运算.c
-2.1 算术运算的C程序实现--作业
-2.2 关系运算的C程序实现
--bukao.c
--字符比较.c
--讨论题:比较大小
-2.2 关系运算的C程序实现--作业
-第二周作业--作业
-2.3 逻辑运算的C程序实现
--计算结合性
--闰年.c
--自动购票问题.c
-2.3 逻辑运算的C程序实现--作业
-2.4 位运算的C程序实现
--讨论题:位运算
-2.5 几种很个别的运算
--讨论题
--讨论题
-2.5 几种很个别的运算--作业
-2.6 混合运算及数据类型转换
--讨论题:数据类型
-2.7 顺序结构程序实例
--Video
--三角形面积.c
--讨论题:工业产值
-2.7 顺序结构程序实例--作业
-3.1 程序中的路径选择实现
--打印学生成绩.c
--一元二次方程.c
-3.1 程序中的路径选择实现--作业
-3.2 路径中的再选择——嵌套判断
--例程
--讨论题:程序改错
-3.2 路径中的再选择——嵌套判断--作业
-3.3 复杂判断问题的C程序设计
--3.3 多级选择
--银行存款.c
--讨论题:多级选择
-3.4 多分支问题的C程序设计
--加减乘除运算.c
-3.4 多分支问题的C程序设计--作业
-3.5 GOTO的适当使用
-3.6 选择结构的程序实例
--3.6 程序展示
--计算第几天.c
--讨论题:输出奇数
--讨论题:计算税金
-3.6 选择结构的程序实例--作业
-第四周作业--作业
-4.1 需要重复执行的程序
--求和.c
--打印学生成绩.c
--统计录入速度.c
--求平均数.c
-4.1 需要重复执行的程序--作业
-4.2 至少要执行一次的循环
--n的阶乘.c
--字符分类统计.c
-4.2 至少要执行一次的循环--作业
-4.3 已知循环次数用for语句
--求和问题.c
--数列求和.c
--讨论题:循环语句
-4.3 已知循环次数用for语句--作业
-4.4 循环控制——简单循环应用
--水仙花数.c
--讨论题:死循环
--讨论题:猜数字
-循环结构的程序设计(一)--4.4 循环控制——简单循环应用
-4.5 循环的嵌套
--讨论题:程序运行
-4.5 循环的嵌套--作业
-4.6 break与continue
--最大素数.c
-4.6 break与continue--作业
-4.7 循环的综合应用
--数的排列组合.c
--鸡兔同笼.c
--打印空心字符.c
--讨论题:打印图形
--讨论题:计算闰年
-第六周作业
-第六周作业--作业
-5.1 同类有序数据处理问题
-5.2 一维数组的定义和引用
--数组定义.c
--数组初始化.c
--反向输出.c
--讨论题:对称数
-5.2 一维数组的定义和引用--作业
-5.3 一维字符串数组
--讨论题:编程
-5.4 字符串处理函数
--字符串反向.c
--字符串函数
-5.5 二维数组的定义与使用
-5.6 二维数组的输入输出
-5.6 二维数组的输入输出--作业
-5.7 二维数组的应用
--转置矩阵.c
--讨论题:修改程序
-5.8 二维字符数组
--5.8 单词排序
--单词排序.c
-5.8 二维字符数组--作业
-5.9 数组综合应用
--统计成绩.c
--统计字符次数.c
--讨论题:洗牌
-本期课程结束语
--end
-第八周编程作业
-《C语言程序设计(上)》期末复习参考
--html
-《C语言程序设计(上)》期末复习参考答案
--html