goto语句在C语言中实现的就是无条件跳转,第二章一上来就介绍goto语句就是要通过goto语句来更加清楚直观的了解控制结构。

我理解的goto语句其实跟switch语句有相似之处,都是进行跳转。不同的是goto语句是进行无条件的跳转,执行到这一句的时候直接就跳转了,而switch语句是要进行一个判断之后才能进行跳转。例如:

下面是用switch语句写的一个程序

  1. #include <stdio.h>
  2. int main(void)
  3. {
  4. char score;
  5. scanf("%c",&score);
  6. switch(score){
  7. case 'A':
  8. printf("excellent\n");
  9. break;
  10. case 'B':
  11. printf("good\n");
  12. break;
  13. case 'C':
  14. printf("pass\n");
  15. break;
  16. default:
  17. printf("fail\n");
  18. }
  19. return ;
  20. }

下面是用伪代码写的用goto语句实现上面switch语句的功能。

  1. #include <stdio.h>
  2. int main(void)
  3. {
  4.     code * lab[] = { lab_a,lab_b,lab_c };
  5.     char score;
  6.     scanf("%c", &score);
  7.     if (score>'C')
  8.         goto lab_default;
  9.     score -= A’;/*score减去A的值为目的标号在跳转表数组中的下标*/
  10.     goto_lab[score];
  11. lab_a:
  12.     printf("excellent\n");
  13.     goto done;
  14. lab_b:
  15.     printf("good\n");
  16.     goto done;
  17. lab_c:
  18.     printf("pass\n");
  19.     goto done;
  20. lab_default:
  21.     printf("fail\n");
  22. done:
  23.     return ;
  24. }

从上面两个程序中我们可以看出来switch语句是要与()内的score进行判断来进行跳转的,如果是’A’,跳转到printf(“”excellent\n);等等,而goto语句是执行到lab[score]这一句的时候,直接跳转去执行lab[score]:。从这就可以看出来goto语句是无条件的跳转。switch语句和if…else语句都属于分支结构,但是两者之间是有差别的,如下用goto语句写的if…else循环。

  1. #include <stdio.h>
  2. int main(void)
  3. {
  4. int a,b;
  5. int t;
  6. scanf(“%d%d”,&a,&b);
  7. t=a>b;
  8. if(t==)
  9. goto true;
  10. printf(“a is lower than b\n”);
  11. goto done;
  12. true:
  13. printf(“a is higher than b\n”);
  14. done:
  15. return ;
  16. }

将if…else语句和switch语句记性对比会发现,switch语句需要提前定义一个数组,这就是一个标号数组,也就是switch语句的跳转表,根据case后边的标号直接去执行标号对应的程序,而if…else语句需要多次比较才会找到要执行的程序。这样对比就会发现switch语句的执行速度要比if…else快,但是通过对比也发现switch语句需要额外的存储空间去存储标号数组。不同的控制结构对于执行程序的效率影响很大,因此需要注意对于控制结构的优化。

if…else语句是要先判断再执行,需要进行对比之后才能进行执行。根据它的这个特点我们可以进行优化,尽量少进行判断就执行,比如统计一篇英文文章字母的个数和标点符号的个数。如果先判断是不是标点符号,再判断是否是英文字母的话,每统计一个英文字母都要进行两次判断,英文文章中出现英文字母的概率最大,因此先判断是否是英文字母就能提高这个程序的效率。

对于条件分支比较多的程序,一般来说switch语句的效率会高一点,但是在有些情况下if..else语句会更合适一点,特别是在与数字进行比较的时候,比如判断是否10~100之间时,用if…else语句会好一点。也就是说在一个区间范围内进行对比的时候,if…else语句会更方便一点。

总的来说了解了if…else语句和switch语句的本质,注意对分支结构的优化,在以后的编程中对于提高程序的效率有很大的帮助。

通过goto语句学习if...else、switch语句并简单优化的更多相关文章

  1. 2、Golang基础--包的使用、if-else语句、循环、switch语句、数组、切片、可变函数参数、map类型

    1 包的使用 // 为了便于组织代码,同一种类型的代码,写在同一个包下,便于管理 // 定义包 -新建一个文件夹 -内部有很多go文件 -在每个go文件的第一行,都要声明包名,并且包名必须一致 -在一 ...

  2. 标准的Switch语句和穿透的Switch语句

    第三章 选择语句 3.1选择语句--Switch switch语句格式: ```java switch(表达式){ case 常量值1: 语句体1; break; case 常量值2: 语句体2; b ...

  3. Oracle中SQL语句学习五(统计分组语句group by和having)

    oracle(41) 在 应用系统开发中,进行需要统计数据库中的数据,当执行数据统计时,需要将表中的数据进行分组显示,在统计分组中是通过group by子句.分组函数.having子句共同实现的.其中 ...

  4. java入门学习(十二)运算语句 if switch

    这两天在网上做兼职,耽误了些博客见谅哈 欢迎来我的博客:www.taomaipin.com java中的运算语句而且频繁用到的无法就是条件语句和循环语句,包括if,for,while,switch,b ...

  5. Java中的switch语句——通过示例学习Java编程(8)

    作者:CHAITANYA SINGH 来源:https://www.koofun.com//pro/kfpostsdetail?kfpostsid=19 当我们在代码逻辑中有多个选项,而且需要为每个选 ...

  6. 【java开发】分支语句、循环语句学习

    一.Java分支语句类型 if-else 语句 switch 关于if-esle语句可以拆分为三种 if语句 if(条件){语句块;} if-else语句if(条件语句){语句块;} if-else ...

  7. C# switch语句的使用

    1  今天我们来学习switch 语句的使用,switch 语句和if else 类似 switch 语句主要的作用是用于来判断在规定条件下   根据你的选择来执行switch 语句下面case :的 ...

  8. 【C语言】-条件语句-switch语句

    switch语句: 用于直接处理不同情况下的多路问题. switch语句又可称为开关语句,其执行流程和多分支if语句类似. switch (表达式) { case 常量表达式1:语句组1;break; ...

  9. 你好,C++(20).4.2.2 表达并列条件选择的switch语句:如果……如果……如果……

    4.2.2  表达并列条件选择的switch语句:如果……如果……如果…… 在现实世界中,还有这样一类特殊的条件选择: 如果明天是晴天,我就穿T恤: 如果明天是阴天,我就穿衬衣: 如果明天是雨天,我就 ...

  10. 1203.2——条件语句 之 switch语句

    用 if else 语句在处理多分支的时候,分支太多就会显得不方便,且容易出现 if 和 else配对出现错误的情况.例如,输入一个整数,输出该整数对应的星期几的英文表示: #include < ...

随机推荐

  1. [No00007F]2016-面经[下] 英文简历写作技巧

    一.简历种类 1.中式 中式简历中,常包括政治面貌,性格及身高体重等.如果中英文简历一起递交,建议中文不写政治面貌,因为如果去外企工作,背景中的政治色彩越少越好,起码没有必要让老外知道. 性格是一个主 ...

  2. google-analytics的使用: 解析页面引入代码

    代码整理和注释 // 创建ga()方法, 加载analytics.js文件 // a, m 作为形参,确保下面的执行不会修改外部的同名变量 (function(win, doc, o, g, ga, ...

  3. C++学习笔记(3)

    本学习笔记是C++ primer plus(第六版)学习笔记.是C++学习笔记(2)的后续.复习C++基础知识的可以瞄瞄. 转载请注明出处http://www.cnblogs.com/zrtqsk/p ...

  4. 【腾讯GAD暑期训练营游戏程序班】游戏场景管理作业说明文档

    场景管理作业说明文档                              用了八叉树的算法,测出三层时最快,区域范围内物体数量为21块,控制台打印出的结果如图所示: 场景物体:游戏中,所有具有空 ...

  5. 重写navigationController的push方法后,出现卡顿现象

    在使用navigation的pushViewController进行push的时候,两个页面间的动画会出现卡顿一下再推出的效果,是因为iOS7 viewController背景颜色的问题,看到大神的博 ...

  6. Windows 10一周年更新正式版官方ISO镜像(1607)

    微软已经开始推送Win10一周年更新正式版系统,按照此前预告微软官方网站也同步推出了Win10一周年更新正式版ISO官方镜像下载,版本已经升级到最新的1607,也就是Win10 Build 1607, ...

  7. Flymeos插桩适配教程

    插桩适配前提,安装Ubuntu或者其他linux系统. 安装JDK7 sudo apt--jdk Ubuntu 16.04与基于它的版本,需要添加源 sudo add-apt-repository p ...

  8. perl 模块安装

    You can check if you have them installed in your machine with: > perl -e 1 -M<module> It wi ...

  9. ED2k Resource

    http://www.lwkk.com/ http://www.ed2000.com/

  10. Examples of MIB Variables - SNMP Tutorial

    30.5 Examples of MIB Variables Versions 1 and 2 of SNMP each collected variables together in a singl ...