通过goto语句学习if...else、switch语句并简单优化
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语句并简单优化的更多相关文章
- 2、Golang基础--包的使用、if-else语句、循环、switch语句、数组、切片、可变函数参数、map类型
1 包的使用 // 为了便于组织代码,同一种类型的代码,写在同一个包下,便于管理 // 定义包 -新建一个文件夹 -内部有很多go文件 -在每个go文件的第一行,都要声明包名,并且包名必须一致 -在一 ...
- 标准的Switch语句和穿透的Switch语句
第三章 选择语句 3.1选择语句--Switch switch语句格式: ```java switch(表达式){ case 常量值1: 语句体1; break; case 常量值2: 语句体2; b ...
- Oracle中SQL语句学习五(统计分组语句group by和having)
oracle(41) 在 应用系统开发中,进行需要统计数据库中的数据,当执行数据统计时,需要将表中的数据进行分组显示,在统计分组中是通过group by子句.分组函数.having子句共同实现的.其中 ...
- java入门学习(十二)运算语句 if switch
这两天在网上做兼职,耽误了些博客见谅哈 欢迎来我的博客:www.taomaipin.com java中的运算语句而且频繁用到的无法就是条件语句和循环语句,包括if,for,while,switch,b ...
- Java中的switch语句——通过示例学习Java编程(8)
作者:CHAITANYA SINGH 来源:https://www.koofun.com//pro/kfpostsdetail?kfpostsid=19 当我们在代码逻辑中有多个选项,而且需要为每个选 ...
- 【java开发】分支语句、循环语句学习
一.Java分支语句类型 if-else 语句 switch 关于if-esle语句可以拆分为三种 if语句 if(条件){语句块;} if-else语句if(条件语句){语句块;} if-else ...
- C# switch语句的使用
1 今天我们来学习switch 语句的使用,switch 语句和if else 类似 switch 语句主要的作用是用于来判断在规定条件下 根据你的选择来执行switch 语句下面case :的 ...
- 【C语言】-条件语句-switch语句
switch语句: 用于直接处理不同情况下的多路问题. switch语句又可称为开关语句,其执行流程和多分支if语句类似. switch (表达式) { case 常量表达式1:语句组1;break; ...
- 你好,C++(20).4.2.2 表达并列条件选择的switch语句:如果……如果……如果……
4.2.2 表达并列条件选择的switch语句:如果……如果……如果…… 在现实世界中,还有这样一类特殊的条件选择: 如果明天是晴天,我就穿T恤: 如果明天是阴天,我就穿衬衣: 如果明天是雨天,我就 ...
- 1203.2——条件语句 之 switch语句
用 if else 语句在处理多分支的时候,分支太多就会显得不方便,且容易出现 if 和 else配对出现错误的情况.例如,输入一个整数,输出该整数对应的星期几的英文表示: #include < ...
随机推荐
- linux文件特殊权限
- 国内可用maven repository 配置
国内可用maven repository 配置 发表于2016/1/4 23:08:04 10235人阅读 分类: maven 鉴于一些原因,从maven中央仓库download依赖包时,被各种折磨 ...
- 吉特仓库管理系统- 斑马打印机 ZPL语言的腐朽和神奇
上一篇文章说到了.NET中的打印机,在PrintDocument类也暴露一些本质上上的问题,前面也提到过了,虽然使用PrintDcoument打印很方便.对应条码打印机比如斑马等切刀指令,不依赖打印机 ...
- 自己写一个JS单向数据流动库----one way binding
JS单向流动其实就是数据到视图的过程, 这几天突发奇想,想着弄一个插件, 把DOM结构使用JS进行描述: 因为DOM中的Class , content, id, attribute, 事件, 子元素全 ...
- 基于NFS的分布式持久化
基于容器的微服务架构中,分布式持久化方案并没有一个默认的最好方案,这里使用NFS来作为容器持久化方案. NFS服务需要在服务器及需要挂载的客户端上分别安装配置. nfs-utils包含服务: rpcb ...
- 上传AppStore出现:Unexpected CFBundleExecutable Key 错误
解决办法:就是把无用的CFBundle删除掉. 根据提示,找到对应第三方的SDK, 找到第三方的info.plist文件,删除里面的Executable file对应的一整行,包括值.
- Code[VS] 3123 高精度练习之超大整数乘法
FFT 做 高精度乘法 #include <bits/stdc++.h> ); struct complex { double a, b; inline complex( , ) { a ...
- Hbase集群master.HMasterCommandLine: Master exiting
2016-12-15 17:01:57,473 INFO [main] impl.MetricsSystemImpl: HBase metrics system started 2016-12-15 ...
- java制作验证码
建立一个web工程
- python 批量扫描mongodb 未授权访问脚本
需要 pymongo库easy_install pymongo脚本: import socket import sys import pymongo ipcons = [] def Scanner(i ...