热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

C中的特殊switch语句

如何解决《C中的特殊switch语句》经验,为你挑选了1个好方法。

我正在阅读CSAPP,关于setjmp和的章节longjmp,并遇到以下代码片段:

int rc;
switch(setjmp(buf));
if (rc == 0)
    foo();
else if (rc == 1)
    printf("sth.");
else if (rc == 2)
    printf("sth. other");
...

switch语句让我很困惑,有人可以为我解释一下C中switch语句的用法吗?


PS:这实际上是CSAPP(第二版)的错误,作者通过switch-case在第三版中使用正常语句来解决这个问题.谢谢大家.



1> Lundin..:

首先,请注意setjmp并且longjmp被认为是令人难以置信的糟糕做法,最糟糕的意大利面条编程.任何教你使用这些功能的学习来源都应该受到极大的怀疑.


至于奇怪的switch语句存在的原因,是因为setjmp标准对函数提出了许多人为要求.C11 7.13.1.1

环境限制setjmp宏的调用只能出现在以下某个上下文中:
- 选择或迭代语句的整个控制表达式;
- 关系或等于运算符的一个操作数与另一个操作数的整数常量表达式,结果表达式是选择或迭代语句的整个控制表达式;
- 一元的操作数!运算符,结果表达式是选择或迭代语句的整个控制表达式; 或
- 表达式语句的整个表达式(可能转换为void).

请注意,上面的最后一点允许使用代码(void) setjmp(env);,因此问题中的switch语句主要是混淆.

C标准基本原理7.13.1解释了为什么这个"函数"具有这样的人为要求,即因为它必须实现为宏:

7.13.1.1 setjmp宏
对setjmp的一个建议要求是它可以像任何其他函数一样使用,也就是说,它可以在任何表达式上下文中调用,并且表达式正确评估setjmp的返回是直接还是通过调用到longjmp.不幸的是,setjmp作为传统被调用函数的任何实现都无法充分了解调用环境以保存在表达式评估中使用的任何临时寄存器或动态堆栈位置.(setjmp宏似乎只有在它扩展为内联汇编代码或调用特殊内置函数时才有帮助.)临时调用可能在初始调用setjmp时是正确的,但不太可能在由对longjmp的相应调用.这些考虑因素决定了setjmp只能从相当简单的表达式中调用的约束,这些表达式不太可能需要临时存储.

说白了:如果你要调用一个函数而不是一个宏,那么CPU/OS可能会堆掉你真正想要setjmp保存的各种寄存器,最值得注意的是程序计数器.(在C语言支持内联函数之前很久就已经指定了setjmp.)


推荐阅读
  • 本文介绍了基于c语言的mcs51单片机定时器计数器的应用教程,包括定时器的设置和计数方法,以及中断函数的使用。同时介绍了定时器应用的举例,包括定时器中断函数的编写和频率值的计算方法。主函数中设置了T0模式和T1计数的初值,并开启了T0和T1的中断,最后启动了CPU中断。 ... [详细]
  • C语言注释工具及快捷键,删除C语言注释工具的实现思路
    本文介绍了C语言中注释的两种方式以及注释的作用,提供了删除C语言注释的工具实现思路,并分享了C语言中注释的快捷键操作方法。 ... [详细]
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 本文介绍了使用PHP实现断点续传乱序合并文件的方法和源码。由于网络原因,文件需要分割成多个部分发送,因此无法按顺序接收。文章中提供了merge2.php的源码,通过使用shuffle函数打乱文件读取顺序,实现了乱序合并文件的功能。同时,还介绍了filesize、glob、unlink、fopen等相关函数的使用。阅读本文可以了解如何使用PHP实现断点续传乱序合并文件的具体步骤。 ... [详细]
  • 本文探讨了C语言中指针的应用与价值,指针在C语言中具有灵活性和可变性,通过指针可以操作系统内存和控制外部I/O端口。文章介绍了指针变量和指针的指向变量的含义和用法,以及判断变量数据类型和指向变量或成员变量的类型的方法。还讨论了指针访问数组元素和下标法数组元素的等价关系,以及指针作为函数参数可以改变主调函数变量的值的特点。此外,文章还提到了指针在动态存储分配、链表创建和相关操作中的应用,以及类成员指针与外部变量的区分方法。通过本文的阐述,读者可以更好地理解和应用C语言中的指针。 ... [详细]
  • Oracle优化新常态的五大禁止及其性能隐患
    本文介绍了Oracle优化新常态中的五大禁止措施,包括禁止外键、禁止视图、禁止触发器、禁止存储过程和禁止JOB,并分析了这些禁止措施可能带来的性能隐患。文章还讨论了这些禁止措施在C/S架构和B/S架构中的不同应用情况,并提出了解决方案。 ... [详细]
  • 海马s5近光灯能否直接更换为H7?
    本文主要介绍了海马s5车型的近光灯是否可以直接更换为H7灯泡,并提供了完整的教程下载地址。此外,还详细讲解了DSP功能函数中的数据拷贝、数据填充和浮点数转换为定点数的相关内容。 ... [详细]
  • 这篇文章主要介绍了Python拼接字符串的七种方式,包括使用%、format()、join()、f-string等方法。每种方法都有其特点和限制,通过本文的介绍可以帮助读者更好地理解和运用字符串拼接的技巧。 ... [详细]
  • 嵌入式处理器的架构与内核发展历程
    本文主要介绍了嵌入式处理器的架构与内核发展历程,包括不同架构的指令集的变化,以及内核的流水线和结构。通过对ARM架构的分析,可以更好地理解嵌入式处理器的架构与内核的关系。 ... [详细]
  • 本文整理了Java面试中常见的问题及相关概念的解析,包括HashMap中为什么重写equals还要重写hashcode、map的分类和常见情况、final关键字的用法、Synchronized和lock的区别、volatile的介绍、Syncronized锁的作用、构造函数和构造函数重载的概念、方法覆盖和方法重载的区别、反射获取和设置对象私有字段的值的方法、通过反射创建对象的方式以及内部类的详解。 ... [详细]
  • 篇首语:本文由编程笔记#小编为大家整理,主要介绍了软件测试知识点之数据库压力测试方法小结相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 使用圣杯布局模式实现网站首页的内容布局
    本文介绍了使用圣杯布局模式实现网站首页的内容布局的方法,包括HTML部分代码和实例。同时还提供了公司新闻、最新产品、关于我们、联系我们等页面的布局示例。商品展示区包括了车里子和农家生态土鸡蛋等产品的价格信息。 ... [详细]
  • 一、Hadoop来历Hadoop的思想来源于Google在做搜索引擎的时候出现一个很大的问题就是这么多网页我如何才能以最快的速度来搜索到,由于这个问题Google发明 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 在2022年,随着信息化时代的发展,手机市场上出现了越来越多的机型选择。如何挑选一部适合自己的手机成为了许多人的困扰。本文提供了一些配置及性价比较高的手机推荐,并总结了选择手机时需要考虑的因素,如性能、屏幕素质、拍照水平、充电续航、颜值质感等。不同人的需求不同,因此在预算范围内找到适合自己的手机才是最重要的。通过本文的指南和技巧,希望能够帮助读者节省选购手机的时间。 ... [详细]
author-avatar
寡妇毒_393
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有