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

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章。

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

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

时间: 2024-11-20 19:29:07

《C专家编程》一1.6 它很棒,但它符合标准吗的相关文章

《C专家编程》一导读

前 言 C专家编程 C代码.C代码运行.运行码运行-请! --Barbara Ling 所有的C程序都做同一件事,观察一个字符,然后啥也不干. --Peter Weinberger 你是否注意到市面上存有大量的C语言编程书籍,它们的书名具有一定的启示性,如:C Traps and Pitfalls(本书中文版<C陷阱与缺陷>已由人民邮电出版社出版), The C Puzzle Book, Obfuscated C and Other Mysteries,而其他的编程语言好像没有这类书.这里有一

《JavaScript专家编程》——第1章 对象和原型 1.1鸟瞰JavaScript

第1章 对象和原型 练习不会造就完美,只有使用最佳的方法来练习才能造就完美. --Vince Lombardi 对专家来说,把JavaScript的核心概念讲上3章似乎有点多,毕竟这些是语言最基本的组成部分.我的主张是,有的人虽然不能读写,但可以说话.就像有的开发人员对JavaScript的基本功能很熟悉,但对里面那些复杂的东西可能就没那么了解了. 本书的目标是像明灯一样照亮语言中那些晦涩的角落.里面包含的很多概念你可能已经试着学习过了,甚至可以假设你已经理解了.这里可以想象一下:你正降落到你大

信息-C++编程问题,不是很懂,求大神解决

问题描述 C++编程问题,不是很懂,求大神解决 定义一个Computer类,包括数据成员CPU(字符串)和Memory(字符串),定义构造函数初始化CPU和Memory的值,定义函数showInfo()显示系统配置信息.定义一个MobilePhone类,包括数据成员联系人Contact(字符串数组),定义构造函数初始化Contact的值,定义函数display()显示联系人信息,定义函数call()拨打电话.定义派生类SmartPhone,继承Computer和MobilePhone类,新增数据

《C专家编程》一1.9 阅读ANSI C标准,寻找乐趣和裨益

1.9 阅读ANSI C标准,寻找乐趣和裨益 有时候必须非常专注地阅读ANSI C标准才能找到某个问题的答案.一位销售工程师把下面这段代码作为测试例发给Sun的编译器小组. 1 foo(const char **p) { } 2 3 main(int argc, char **argv) 4 { 5 foo(arvg); 6 } 如果编译这段代码,编译器会发出一条警告信息: line 5: warning: argument is incompatible with prototype (第5行

流氓软件案很棒小秘书终审败诉

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 "很棒小秘书"二审仍败诉,近日,沸沸扬扬的沪上首例因"流氓软件"而引发的侵权纠纷案终于有了二审结果,上海很棒信息技术有限公司(下称很棒公司)请求二审法院撤销原判的诉讼请求未得到法院的支持.法院认为,"很棒小秘书"侵犯了消费者的知情权.选择权,同时也造成了消费者的财产损失. 原告起诉

.Net很棒,但我迷失了方向----Java为我打开了一扇窗

  .Net很棒,但我迷失了方向 ----Java为我打开了一扇窗 记得CSDN<程序员>杂志曾刊登过一篇文章,标题是".Net很棒,但微软迷失了方向",内容记不得了,但我现在发现:我迷失了方向! 学习和应用ASP.NET了多年,从一无所知到自以为是高手,我却逐渐不知道下一步的路该怎么走,身边没有高人指点,也不能经常泡在网上(工作原因),独自摸索,孤寂而迷茫.偶尔因为.Net项目的事情与同事wcy讨论Java与.Net的异同(同事以前做过Java的Web开发,但没有做过.N

对Web开发者非常有价值10个很棒的网站

很多网站默默无闻,但为开发者提供了非常有帮助的内容和功能,本文列出10个很棒的网站,真的对Web开发者非常有价值. Em Chart Em Chart 是一个很有用的工具用来快速简单的将网页上的 em 转成像素值. Twitter API Explorer 该网址为你提供 Twitter API 的浏览和搜索,同时提供了一些可运行的示例代码. Mysql Format Date 它允许使用 MySQL 的 DATE_FORMAT 函数对日期进行格式化,通过选择一个通用的日期格式,页面的底部将会显

20个很棒的黑色系背景的网站设计

下面展示20个很棒的黑色系背景的网站设计 尽管我并不是非常喜欢带有很多文字的黑色背景网站,但是它一直看起来很棒,特别是对于作品集网站.本次收集展示一些很好看的使用黑色系背景的网站设计. 1. Andrea Ziino 2. Martin Iglesias 3. iWant iPhone 4. Spiffing Apps 5. Envisage 6. Webdesig-ne.ws 7. Selva 8. Sublimeo 9. RareForm Branding 10. Parabolic Pla

Photoshop文字特效教程:特效很棒的冰雪字

微博上都在说东北暴雪咯,大家注意添暖加衣,那么今天分享一个应景的pS教程.教您创建一个超炫的冰霜字体.特效真的很棒哟,过程很详细,童鞋们赶紧来练练手呐 ^_^ 小提示:教程是在CC版本下进行的,操作面板可能会有一点不同 : ) 这是完成后的效果图: 开工前先来下载几个文件,分别是: 墙壁背景 coolvetica 字体 玻璃素材 烟雾素材 已打包咯,童鞋们下载整个文件就好 → 素材下载 挺胸收腹,练习开始: 第一步: 创建一个大小为1200px*700px的文件,填充黑色背景.把下载的墙壁背景复