《C专家编程》一1.6 它很棒,但它符合标准吗

本节书摘来自异步社区《C专家编程》一书中的第1章,第1.6节,作者 【美】Perter Van Der Linde,更多章节内容可以访问云栖社区“异步社区”公众号查看

1.6 它很棒,但它符合标准吗

不要添乱——立即解散ISO工作小组。

——匿名人士

ANSI C标准可以说是非常独特的,我们可以从好几个有趣的方面来说明这一点。它定义了下面一些术语,用于描述某种编译器的特点。如果你对这些术语有一个比较好的了解,就有助于你理解什么东西能被语言接受,什么东西不能被语言接受。前两个术语涉及不可移植的代码(unportable code),接下来的两个术语跟坏代码(bad code)有关,而最后两个术语则跟可移植的代码(portable code)有关。

不可移植的代码(unportable code):

由编译器定义的(implementation-defined)——由编译器设计者决定采取何种行动(就是说,在不同的编译器中所采取的行为可能并不相同,但它们都是正确的),并作好文档记录。

例如:当整型数向右移位时,要不要扩展符号位。

未确定的(unspecified)——在某些正确情况下的做法,标准并未明确规定应该怎样做。

例如:参数求值的顺序。

坏代码(bad code):

未定义的(undefined)——在某些不正确情况下的做法,但标准并未规定应该怎样做。你可以采取任何行动,可以什么也不做,也可以发出一条警告信息,或者可以中止程序以及让CPU陷入瘫痪,甚至可以发射核导弹(只要你安装了能发射核弹的硬件系统)。

例如:当一个有符号整数溢出时该采取什么行动。

约束条件(a constraint)——这是一个必须遵守的限制或要求。如果你不遵守,那么你的程序的行为就会变成像上面所说的属于未定义的。这就出现了一种很有意思的情况:分辨某种东西是否是一个约束条件是很容易的,因为标准的每个主题都附有一个“约束(constraint)”小节,列出了所有的约束条件。现在又出现了一个更为有趣的情况:标准规定[5]编译器只有在违反语法规则和约束条件的情况下才能产生错误信息!这意味着所有不属于约束条件的语义规则你都可以不遵循,而且由于这种行为属于未定义行为,编译器可以采取任何行动,甚至不必通知你!

例如:%操作符的操作数必须属于整型。所以,在非整数数据上使用%操作符肯定会引发一条错误信息。

不属于约束条件规则的例子:所有在C语言标准头文件中声明的标识符均保留,所以不能声明一个叫作malloc()的函数,因为在标准头文件里已经有一个函数以此为名。但由于这个规定不是约束条件,因此可以违反它,而且编译器甚至可以不警告你!关于“interpositioning”这一小节的更多内容,参见第5章。


1744f65d1127c9e86d0fa3cfd9afc8ba33245468

未定义的行为在IBM PC中引起CPU瘫痪!

未定义的软件行为引起CPU瘫痪的说法并不像它乍听上去那样牵强。

IBM PC的显示器以显示控制芯片所提供的水平扫描速率工作。回扫变压器(flyback transformer,一种产生高电压的装置,用于加速电子以点亮显示器上的荧光物质)需要保持一个合理的频率。

然而在软件中,程序员有可能把视频芯片的扫描速率设置成零,这样就会产生一个恒定的电压输出到回归变压器的输入端。这就使它起了电阻器的作用,只是把电能转换成热能,而不是传送到屏幕。这会在数秒之内就把显示器烧毁,那就是未定义的软件行为会导致系统瘫痪的理由。
可移植的代码(portable code):

严格遵循标准的(strictly-conforming)—— 一个严格遵循标准的程序应该是:

只使用已确定的特性。

不突破任何由编译器实现的限制。

不产生任何依赖由编译器定义的或未确定的或未定义的特性的输出。

这样规定的主要目的就是最大限度地保证可移植性。这样,不论你在什么平台上运行严格遵循标准的程序都会产生相同的输出。事实上,在所有遵循标准的程序中,属于这一类的程序并不多。例如,下面这个程序就不是严格遵循标准的:

#include <limits.h>
#include <stdio.h>
int main() { (void)printf("biggest int is %d", INT_MAX); return 0;}/*并不严格遵循标准:其输出结果是由编译器定义的。*/

在本书的剩余部分,我们通常并不强求例子程序严格遵循标准。因为如果这样做会使文本看上去比较乱,而且不利于理解所讨论的要点。程序的可移植性是非常重要的,所以在你的现实编码中,应该始终要保证加上必要的类型转换、返回值等。

遵循标准的(conforming)——一个遵循标准的程序可以依赖一些某种编译器特有的不可移植的特性。所以,一个程序有可能在一个特定的编译器里是遵循标准的,但在另一个编译器里却是不遵循标准的。它可以进行扩展,但这些扩展不能修改严格遵循标准的程序的行为。但是,这个规则并不是一个约束条件,所以对于你的程序中不遵循标准之处,你不要指望编译器会给出一条警告信息指出你违反了规定!

上面所举的几个程序实例都是遵循标准的。

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

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

相关文章

abap al设置单元格可编辑 oo_excel表格操作: 图形和图表编辑技巧汇总(二)

1. 快速选取图表元素图表创建好以后&#xff0c;我们还需要对某些图表元素进行编辑和格式化。图表区包括整个图表和它的全部元素&#xff0c;当你选取图表区后&#xff0c;你就可以看到8个黑色小方块。要想调整单个的图表对象&#xff0c;首先必须选取该对象&#xff0c;然后更…

我的北航故事

我的北航故事 致 沙航的我 既然是故事&#xff0c;那就一定少不了我们耳熟能详的时间&#xff0c;地点&#xff0c;人物&#xff0c;事件&#xff0c;发展&#xff0c;高潮&#xff0c;结局。经过反复的琢磨&#xff0c;我觉得还是写成日记形式比较适合&#xff0c;一是为了掩盖…

CDB和PDB的创建、连接、启动、关闭

CDB和PDB的创建、连接、启动、关闭 一、CDB和PDB基本管理 基本概念&#xff1a; Multitenant Environment&#xff1a;多租户环境 CDB&#xff08;Container Database&#xff09;&#xff1a;数据库容器 PD&#xff08;Pluggable Database&#xff09;&#xff1a;可插拔数据库…

控制usb扫码枪_无线也可以很牢靠-世达SATA热熔胶枪评测

作为一名喜欢动手制作的手工达人&#xff0c;往往乐趣就在于动手过程中的成就感。而在对零件进行固定时&#xff0c;热熔胶由于可以包裹裸露的电线线头&#xff0c;固定效果也非常好&#xff0c;相比电焊也更加的简单易操作&#xff0c;因而被很多人选择。但是&#xff0c;多数…

Anaconda管理多版本的python环境

通过Conda的环境管理功能&#xff0c;我们能同时安装多个不同版本的Python&#xff0c;并能根据需要自由切换。下面我将给大家分享一下&#xff0c;新增Python版本&#xff0c;切换&#xff0c;再切回主版本的详细过程。 方法/步骤 1首先确保你的系统里已经安装了Conda&#xf…

父子沪c转大牌过户_机动车异地过户(转籍)

最近我家换了一辆车&#xff0c;导航后台数据统计是去足浴城最多的车主&#xff0c;尬&#xff01;从想起这个品牌到付定金&#xff0c;也就半天时间&#xff0c;买之前没了解这么透彻。不过&#xff0c;到手驾驶&#xff0c;还是比之前的车舒适很多的&#xff0c;就是容易在不…

android安卓系统2.3 使用说明书,Android2.3操作界面

Android2.3操作界面摩托罗拉XT882的界面相对于原生的Gingerbread还是有了不小的变化&#xff0c;首先最大的感觉就是主色调亮了很多。默认背景在qHD分辨率下非常的清晰&#xff0c;同时整个界面仍然采用了多分屏界面。下方由中国电信定制&#xff0c;状态栏加入了全新的单个状态…

Linux 下 nginx反向代理与负载均衡

前面几篇记录下nginx的基本运功&#xff0c;代理服务器的访问&#xff0c;这里来试验下nginx的反向代理。 反向代理&#xff08;Reverse Proxy&#xff09;方式是指以代理服务器来接受internet上的连接请求&#xff0c;然后将请求转发给内部网络上的服务器&#xff0c;并将从服…

android 8.1没声音,Android 8.1重大改变!耳机孔不见了

原标题&#xff1a;Android 8.1重大改变&#xff01;耳机孔不见了今天上午&#xff0c;Android Police爆料称&#xff0c;下一代的Pixel 2将首发Android 8.1。更重要的是&#xff0c;在这个新系统中&#xff0c;谷歌已经做好了放弃3.5mm耳机插口的准备&#xff0c;并将在底层优…

Leetcode:0002(两数之和)

LeetCode&#xff1a;0002&#xff08;两数之和&#xff09; 题目描述&#xff1a;给定两个非空链表来表示两个非负整数。位数按照逆序方式存储&#xff0c;它们的每个节点只存储单个数字。将两数相加返回一个新的链表。你可以假设除了数字 0 之外&#xff0c;这两个数字都不会…

《Excel 职场手册:260招菜鸟变达人》一第 13 招 利用数据验证给单元格添加注释,不用批注...

本节书摘来异步社区《Excel 职场手册&#xff1a;260招菜鸟变达人》一书中的第1章&#xff0c;第13节&#xff0c;作者&#xff1a; 聂春霞 , 佛山小老鼠 责编&#xff1a; 王峰松&#xff0c;更多章节内容可以访问云栖社区“异步社区”公众号查看。 第 13 招 利用数据验证给单…

《机器人学经典教程》——2.2 控制论

本节书摘来异步社区《机器人学经典教程》一书中的第2章&#xff0c;第2.2节&#xff0c;作者&#xff1a;【美】Maja J. Matarić&#xff08;马娅•马塔里奇&#xff09;&#xff0c;更多章节内容可以访问云栖社区“异步社区”公众号查看。 2.2 控制论 随着控制理论的不断发展…

《CCIE路由和交换认证考试指南(第5版) (第1卷)》——1.6节虚拟交换系统

本节书摘来自异步社区《CCIE路由和交换认证考试指南&#xff08;第5版&#xff09; &#xff08;第1卷&#xff09;》一书中的第1章&#xff0c;第1.6节虚拟交换系统&#xff0c;作者 【美】Narbik Kocharians&#xff08;那比克 科查理安&#xff09; , 【斯洛伐克】Peter Pal…

远程执行漏洞修复方案_请马上修复!SaltStack远程命令执行漏洞

【漏洞预警】SaltStack远程命令执行漏洞(CVE-2020-11651、CVE-2020-11652)2020年5月3日&#xff0c;阿里云应急响应中心监测到近日国外某安全团队披露了SaltStack存在认证绕过致命令执行漏洞以及目录遍历漏洞。漏洞描述SaltStack是基于Python开发的一套C/S架构配置管理工具。国…

html设置模块宽度为200像素,css 宽度(CSS width)

DIV CSS宽度width样式属性CSS 宽度是指通过CSS 样式设置对应div宽度&#xff0c;以下我们了解传统html宽度、宽度自适应百分比、固定宽度等宽度知识。传统Html 宽度属性单词&#xff1a;width 如width"300";CSS 宽度属性单词&#xff1a;width 如width:300px;一、Wid…

jquery 样式获取设置值_jQuery获取样式中的背景颜色属性值/颜色值

天使用jQuery获取样式中的background-color的值时发现在获取到的颜色值在IE中与Chrome、Firefox显示的格式不一样&#xff0c;IE中是以HEX格式显示#ffff00&#xff0c;而Chrome、Firefox中则是以GRB格式显示rgb(255,0,0)&#xff0c;由于需要将颜色值存储到数据库中&#xff0c…

《思科数据中心I/O整合》一2.11 活动-活动连接(Active-Active)

本节书摘来自异步社区《思科数据中心I/O整合》一书中的第2章&#xff0c;第2.11节&#xff0c;作者【美】Silvano Gai , Claudio DeSanti&#xff0c;更多章节内容可以访问云栖社区“异步社区”公众号查看 2.11 活动-活动连接&#xff08;Active-Active&#xff09; 思科数据中…

JS Ajax异步请求发送列表数据后面多了[]

还在苦逼的写代码&#xff0c;这里就不详细了&#xff0c;直接抛出问题&#xff1a; 如图所示&#xff1a; 前端ajax请求向后端发送数据的时候&#xff0c;给key添加了[]出现很多找不到原因&#xff0c; 后面在说 解决方法&#xff1a; 暂时先这样记录一下&#xff0c;下次方便…

ftp如何预览图片 解决方案

下载使用 server-U &#xff0c;开启 HTTP 服务&#xff0c;输入 http://ip:端口 后&#xff0c;登录ftp账号密码&#xff0c;可选使用 基于java的应用 web client 或 FTP Voyager JV&#xff0c;来预览图片。 本来想走 windows 文件共享服务预览图片&#xff0c;可是 貌似 被防…

《面向对象的思考过程(原书第4版)》一 导读

本节书摘来自华章出版社《面向对象的思考过程&#xff08;原书第4版&#xff09;》一书中的第3章&#xff0c;第3.2节&#xff0c;&#xff3b;美&#xff3d; 马特魏斯费尔德&#xff08;Matt Weisfeld&#xff09; 著黄博文 译更多章节内容可以访问云栖社区“华章计算机”…