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

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

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

 #include <stdio.h>
int main(void)
{
char score;
scanf("%c",&score);
switch(score){
case 'A':
printf("excellent\n");
break;
case 'B':
printf("good\n");
break;
case 'C':
printf("pass\n");
break;
default:
printf("fail\n");
}
return ;
}

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

 #include <stdio.h>
int main(void)
{
    code * lab[] = { lab_a,lab_b,lab_c };
    char score;
    scanf("%c", &score);
    if (score>'C')
        goto lab_default;
    score -= ’A’;/*score减去A的值为目的标号在跳转表数组中的下标*/
    goto_lab[score];
lab_a:
    printf("excellent\n");
    goto done;
lab_b:
    printf("good\n");
    goto done;
lab_c:
    printf("pass\n");
    goto done;
lab_default:
    printf("fail\n");
done:
    return ;
}

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

 #include <stdio.h>
int main(void)
{
int a,b;
int t;
scanf(“%d%d”,&a,&b);
t=a>b;
if(t==)
goto true;
printf(“a is lower than b\n”);
goto done;
true:
printf(“a is higher than b\n”);
done:
return ;
}

将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. Time.deltaTime 的平均值在0.1-0.2左右

    Time.deltaTime 平均值在0.1-0.2左右 低的在0.03 高的在0.3

  2. Rect 和 Bounds

    Rect 表示一个2D矩形区域 Bounds 表示一个3D的方块区域 http://www.cnblogs.com/crazylights/p/3977348.html

  3. tfs2012迁移,只用到源代码管理

    背景:在虚拟机里面安装的tfs,后来发觉C盘空间太少了,运行卡,准备重新配置一台虚拟机当做tfs服务器.安装相同版本的tfs.数据库(至少比原来的版本一样或者更高版本,要不附加不了数据库). 1.确保 ...

  4. knockoutJS学习笔记04:监控属性

    一.语法介绍 先来看一个简单的例子: <span data-bind="text:name"></span> var obj = {name:ko.obse ...

  5. JavaScript之命名空间模式 浅析

    来源于:http://www.cnblogs.com/syfwhu/p/4885628.html 前言 命名空间可以被认为是唯一标识符下代码的逻辑分组.为什么会出现命名空间这一概念呢?因为可用的单词数 ...

  6. 如何解决wow.js与fullpage的兼容性

    项目需要做到全屏显示的同时还需要做到实时执行动画.但是发现在使用fullpage之后,wow.js(不知道这个是啥的点击这里)不起作用. 找了诸多资料,解决方法如下: $('#fullpage').f ...

  7. POJ 2942 Knights of the Round Table

    Knights of the Round Table Time Limit: 7000MS   Memory Limit: 65536K Total Submissions: 10911   Acce ...

  8. [bigdata] 启动CM出现 “JDBC Driver class not found: com.mysql.jdbc.Driver” 以及“Error creating bean with name 'serverLogFetcherImpl'”问题的解决方法

    问题:“JDBC Driver class not found: com.mysql.jdbc.Driver”  通过以下命令启动cm [root@hadoop1 ~]# /etc/init.d/cl ...

  9. 分析DH加密算法,一种适基于密钥一致协议的加密算法。

    DH Diffie-Hellman算法(D-H算法),密钥一致协议.是由公开密钥密码体制的奠基人Diffie和Hellman所提出的一种思想.简单的说就是允许两名用户在公开媒体上交换信息以生成&quo ...

  10. win10 64位安装memcache扩展和开启redis扩展

    前面有关于win10下搭建wamp环境的介绍,在此不在赘述,php操作memcache有memcache库和memcached库,其中memcache是php内置的扩展库,支持面向对象和面向过程两种操 ...