通过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 < ...
随机推荐
- Mysql 存储引擎 InnoDB与Myisam的主要区别
MySQL默认采用的是MyISAM. 1,事务处理 innodb 支持事务功能,myisam 不支持. Myisam 的执行速度更快,性能更好. MyISAM不支持事务,而InnoDB支持.InnoD ...
- 关于SIGSEGV错误及处理方法(转)
转自:http://blog.csdn.net/brace/article/details/1102422 今天编程遇到了SIGSEGV错误,比较困惑,所以找了些资料,总结一下: (1)官方说法是 ...
- 使用Unity Container
Lab1.使用Unity Container Unity Container最主要的两个方法就是RegisterType和Resolve了,RegisterType用于注册类型的映射,而Resolve ...
- PHP引用(&)使用详解
初学php关于&引用 官方文档: 1.引用是什么:http://www.php.net/manual/zh/language.references.whatare.php 2.引用做什么:ht ...
- 取文件MD5 WINAPI
#include <windows.h> #include <wincrypt.h> #include <stdio.h> BOOL GetFileHash(LPC ...
- BAD APPLE C++控制台程序
使用C++语言编写,如果想改成C语言,手动以GetProcAddress的方式来调用相关函数即可. #include <windows.h> #include <mmsystem.h ...
- 千万别把WIFI玩坏了!关于WIFI的新鲜玩法和商业模式探讨
使用WIFI作为无线上网接入,也许大家都比较习以为常的.但是你们知道吗,其实WIFI还有很多种玩法:基于WIFI的身份识别,WIFI感知,WIFI Direct等等.今天我们会着重介绍一种WIFI的有 ...
- 覆盖问题:最大覆盖问题(Maximum Covering Location Problem,MCLP)和集覆盖问题(Location Set Covering Problem,LSCP)
集覆盖问题研究满足覆盖所有需求点顾客的前提下,服务站总的建站个数或建 设费用最小的问题.集覆盖问题最早是由 Roth和 Toregas等提出的,用于解决消防中心和救护车等的应急服务设施的选址问题,他们 ...
- 《Java EE 开发技术与案例教程》 这是一本好书啊:简洁精辟(相见恨晚)
第一章:Java EE 概述 1.get:JPA:Java Persistence API, 数据持久化API: JPA是一种ORM规范,它的实现实例:Hibernate.mybatis 2.Web ...
- Linux 查找文件并删除文件内容
find * ./ |while read file; do echo ''>$file; done