选择结构 案例分析

C语言goto,longjmp()和setjmp()之间有什么区别

goto语句实现程序执行中的近程跳转(local jump),longjmp()和setjmp()函数实现程序执行中的远程跳转(nonlocaljump,也叫farjump)。通常你应该避免任何形式的执行中跳转,因为在程序中使用goto语句或longjmp()函数不是一种好的编程习惯。

goto语句会跳过程序中的一段代码并转到一个预先指定的位置。为了使用goto语句,你要预先指定一个有标号的位置作为跳转位置,这个位置必须与goto语句在同一个函数内。在不同的函数之间是无法实现goto跳转的。

下面是一个使用goto语句的例子:
void bad_programmers_function(void)
{
     int x
     printf("Excuse me while I count to 5000... \n") ;
     x----l~
     while (1)
    {
           printf(" %d\n", x)
           if (x ==5000)
                 goto all_done
           else
                 x=x+1;
    }
all_done:
     prinft("Whew! That wasn't so bad, was it?\n");
}
如果不使用goto语句,是例可以编写得更好。下面就是一个改进了实现的例子:
void better_function (void)
{
     int x
     printf("Excuse me while I count to 5000... \n");
     for (x=1; x<=5000, x++)
           printf(" %d\n", x)
     printf("Whew! That wasn't so bad, was it?\n") ;
}

前面已经提到,longjmp()和setjmp()函数实现程序执行中的远程跳转。当你在程序中调用setjmp()时,程序当前状态将被保存到一个jmp_buf类型的结构中。

此后,你可以通过调用longjmp()函数恢复到调用setjmp()时的程序状态。与goto语句不同,longjmp()和setjmp()函数实现的跳转不一定在同一个函数内。然而,使用这两个函数有一个很大的缺陷,当程序恢复到它原来所保存的状态时,它将失去对所有在longjmp()和setjmp()之间动态分配的内存的控制,也就是说这将浪费所有在longjmp()和setjmp()之间用malloc()和calloc()分配所得的内存,从而使程序的效率大大降低。

因此,你应该尽量避免使用longjmp()和setjmp()函数,它们和goto语句一样,都是不良编程习惯的表现。

下面是使用longjmp()函数和setjmp()函数的一个例子:
#include <stdio.h>
#include <setjmp.h>
jmp_buf saved_state;
void main(void);
void call_ longjmp (void);
void main(void)
{
     int ret_code;
     printf("The current state of the program is being saved... \n");
     ret_code = setjmp (saved_state)
     if (ret_code ==1)
     {
           printf("The longjmp function has been called. \n" )
           printf("The program's previous state has been restored. \n");
           exit(0)
     }
     printf("I am about to call longjmp and\n");
     printf('return to the previous program state... \n" )
     call_ longjmp ( )
}
void call_longjmp (void)
{
     longjmp (saved_state, 1 )
}

switch语句的最后一个分支可以不要break语句吗

尽管switch语句的最后一个分支不一定需要break语句,但最好还是在switch语句的每个分支后面加上break语句,包括最后一个分支。

这样做的主要原因是:你的程序很可能要让另一个人来维护,他可能要增加一些新的分支,但没有注意到最后一个分支没有break语句,结果使原来的最后一个分支受到其后新增分支的干扰而失效。在每个分支后面加上break语句将防止发生这种错误并增强程序的安全性。

此外,目前大多数优化编译程序都会忽略最后一条break语句,所以加入这条语句不会影响程序的性能。

请参见:
1、什么时候用一条switch语句比用多条if语句更好?
2、switch语句必须包含default分支吗?

C语言switch语句必须包含default分支吗

不!但是为了进行错误检查或逻辑检查,还是应该在switch语句中加入default分支。

例如,下述switch语句完全合法:
switch (char_code)
{
      case tyt:
      case 'y': printf ( " You answered YES ! \n" )
           break
      case 'N':
      case 'n': printf ("You answered NO!\n");
           break
}

但是,如果一个未知字符被传递给这条switch语句,会出现什么情况呢?这时,程序将没有任何输出。因此,最好还是加入一个default分支,以处理这种情况:
......
default: printf ("Unknown response : %d\n", char_code);
          break
......

此外,default分支能给逻辑检查带来很多方便。例如,如果用switch语句来处理数目固定的条件,而且认为这些条件之外的值都属于逻辑错误,那么可以加入一个default分支来辨识逻辑错误。

请看下列:
void move_cursor (int direction)
{
     switch (direction)
     {
           case UP:     cursor_up()
                            break
           case DOWN:   cursor_down()
                            break
           case LEFT:   cursor_left ()
                            break
           case RIGHT:  cursor_ right ( )
                             break
           default:     printf ("Logic error on line number %ld!!! \n",
                                     __ LINE__ )
                             break
     }
}

请参见:   
1、什么时候用一条switch语句比用多条if语句更好?
2、Switch语句的最后一个分支可以不要break语句吗?

C语言编程中,什么时候用一条switch语句比用多条if语句更好

如果你有两个以上基于同一个数字(numeric)型变量的条件表达式,那么最好使用一条switch语句。

例如,与其使用下述代码:
if (x ==l)
     printf ("x is equal to one. \n");
else if (x ==2)
     printf ("x is equal to two. \n");
else if (x = =3)
     printf ("x is equal to three. \n");
else
     printf ("x is not equal to one, two, or three. \n");
不如使用下述代码,它更易于阅读和维护:
switch (x)
{
     case 1:  printf ("x is equal to one. \n");
                      break;
     case 2:  printf ("x is equal to two. \n");
                      break
     case 3:  printf ('x is equal to three. \n");
                      break;
     default: printf ("x is not equal to one, two, or three. \n");
                      break;
}

注意:使用switch语句的前提是条件表达式必须基于同一个数字型变量。例如,尽管下述if语句包含两个以上的条件,但该例不能使用switch语句,因为该例基于字符串比较,而不是数字比较:
   char *name="Lupto";
    if(!stricmp(name,"Isaac"))   
        printf("Your name means'Laughter'.\n");
    else if(!stricmp(name,"Amy"))
        printf("Your name means'Beloved'.\n");
    else if(!stricmp(name,"Lloyd"))
        printf("Your name means'Mysterious'.\n");
    else
        printf("I haven't a clue as to what your name means.\n");

请参见:
1、switch语句必须包含default分支吗7   
2、switch语句的最后一个分支可以不要break语句吗?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/450464.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python基础班---第一部分(基础)---Python基础知识---第一个Python程序

01. 第一个 HelloPython 程序 1.1 Python 源程序的基本概念 Python 源程序就是一个特殊格式的文本文件&#xff0c;可以使用任意文本编辑软件做 Python 的开发Python 程序的 文件扩展名 通常都是 .py1.2 演练步骤 在桌面下&#xff0c;新建 Python基础1 目录在 Python基础1 目录…

面试题-集合

1.JAVA 中数组和集合的区别 &#xff1f; &#xff08;1&#xff09;数组的长度是固定的&#xff0c;而集合长度是可以改变的。 &#xff08;2&#xff09;数组可以储存基本数据类型和引用数据类型&#xff0c;而集合只能储存引用数据类型&#xff08;也就是对象&#xff09;…

七牛云上传视频如何有效做到节省空间

在上传视频的时候&#xff0c;我们通常会保存到第三方【七牛云】平台。不过大多数程序员在系统后台上传视频后&#xff0c;一般都是保存到了本地&#xff0c;如果视频非常多或者视频容量特别大的情况下&#xff0c;那么我们的服务器迟早有一天会满&#xff0c;为了节省空间&…

运算符的优先级总能起作用吗?

有关运算符优先级的规则稍微有点复杂。在大多数情况下&#xff0c;这些规则确实是你所需要的&#xff0c;然而&#xff0c;有人也指出其中的一些规则本来是可以设计得更好的。让我们快速地回顾一些有关内容&#xff1a;“运算符优先级”是这样一些规则的集合——这些规则规定了…

按钮交互loading ---- 转圈圈 加载

按钮loading状态自定义选项&#xff08;功能&#xff09;&#xff1a; 可以在元素上添加 data-am-loading 来设置选项&#xff1a; spinner 加载动画图标&#xff0c;适用于支持 CSS3 动画、非 input 元素&#xff0c;写图标名称即可&#xff1b;loadingText 加载时显示的文字&…

面试题-线程

1.什么是线程 &#xff1f;线程和进程的区别 &#xff1f; 线程是操作系统能够进行运算调度的最小单位&#xff0c;它被包含在进程之中&#xff0c;是进程中的实际运作单位。而进程是系统中 正在运行的一个程序&#xff0c;程序一旦运行就是进程。 区别&#xff1a;&#xf…

区块链入门教程

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 区块链&#xff08;blockchain&#xff09;是眼下的大热门&#xff0c;新闻媒体大量报道&#xff0c;宣称它将创造未来。 可是&#xf…

响应式面包屑菜单

在线演示 本地下载 转载于:https://www.cnblogs.com/qixidi/p/10064991.html

5个能提高你工作效率的Excel技巧

Excel的应用在工作中还是十分广泛的&#xff0c;那么下面小编就来为大家分享5个Excel技巧来帮助大家轻松提高工作效率。1. 不用数据验证或数据有效性&#xff0c;自动生成下拉列表方法&#xff1a;按【Alt↓】组合键注意点&#xff1a;光标要定位在已有数据区域的下一个单元格&…

很好的推荐书籍

五百本编程书籍推荐【信息化类】 书号书名作者出版时间定价对应页码TP02041企业资源计划&#xff08;ERP&#xff09;教程罗鸿2006-1&#xffe5;28.00—TP02031ERP理论、方法与实践周玉清 等2005-12&#xffe5;39.00—TP01059ERP原理设计实施&#xff08;第3版&#xff09;罗…

消息推送

我有一个运动类app软件,它的服务器是集群式的&#xff0c;有N台服务器。现在我想在app上开发一个功能&#xff0c;在每天的晚上11点进行消息推送&#xff0c;他会推送今天走多少步&#xff0c;是否健康&#xff0c;明天至少走多少步。请问如何11点能准时触达到用户&#xff1f;…

day10:函数进阶

1&#xff0c;函数的命令空间&#xff08;内置命名空间&#xff0c;全局命名空间&#xff0c;局部命名空间&#xff09;&#xff0c;内置大于全局大于局部 2&#xff0c;内置命名空间&#xff0c;就是Python解释器一启动就可以使用的名字&#xff0c;存储在内置命名空间中&…

mysql导入source注意点

mysql的导入导出要注意字符集&#xff0c;防止查询乱码&#xff01; 导入前设置字符集 set names utf8; //导入指定编码source /xxx.sqlcommit;

哔哩哔哩修改视频速度

按住f12,打开控制台&#xff0c;先输入 const video document.querySelector("video"); video.play() // 开始 video.pause() // 暂停 video.playbackRate3 // 三倍速

编译预处理

C语言编译中&#xff0c;什么时候应该使用32位编译程序? 32位编译程序应该在32位操作系统上使用。由32位编译程序生成的32位程序比16位程序运行得更快&#xff0c;这正是任何32位的东西都很热门的原因。有那么多不同版本的Microsoft Windows&#xff0c;它们和哪种编译程序组成…

去除List集合中的重复值(四种好用的方法)

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 最近项目中需要对list集合中的重复值进行处理&#xff0c;大部分是采用两种方法&#xff0c;一种是用遍历list集合判断后赋给另一个list…

jQuery---过滤选择器

4、过滤选择器 过滤选择器主要是通过特定的过滤规则来筛选出所需的DOM元素&#xff0c;过滤规则与CSS 中的伪类选择器语法相同&#xff0c;即选择器都以一个冒号(:)开头。按照不同的过滤规则&#xff0c; 过滤选择器可以分为基本过滤、内容过滤、可见性过滤、属性过滤、子元素过…

安装Frida抓包工具

curl https://bootstrap.pypa.io/get-pip.py | python3 pip install frida pip install frida-tools

正则介绍_grep

2019独角兽企业重金招聘Python工程师标准>>> 10月16日任务 9.1 正则介绍_grep上 9.2 grep中 9.3 grep下 grep基本用法 grep [-cinvABC] word filename centos7.x版本的grep实则为grep --colorauto-c 显示匹配到的行数[rootlocalhost ~]# cp /etc/passwd /tmp [rootl…

[国家集训队]middle

嘟嘟嘟 有谁能想到这题会用到主席树呢&#xff1f;&#xff08;不愧是WJMZBMR出的题&#xff09; 首先考虑如果区间是固定的话&#xff0c;中位数该怎么求。 没错&#xff0c;二分。如果大于当前二分值\(mid\)的数比小于\(mid\)的数多&#xff0c;说明\(mid\)还可以再变大&…