首页 » 排名链接 » C 语言的规范与实现(语言标准规范事情的人)

C 语言的规范与实现(语言标准规范事情的人)

admin 2024-11-24 02:30:50 0

扫一扫用手机浏览

文章目录 [+]

C 标准委员会必须适应实现 C 的大量系统。
这些系统的硬件工作方式和类型表示方式不同。
这就是为什么,例如,C 标准没有说 int 是 32 位,double 是 64 位,因为在各种系统上,int 可以是 128 位,double 可以是 512 位。
相反,C 标准只规定了 int 和 double 需要存储的最小值,并且没有对可表示值的上限施加限制。

标准中实现的定义

C 标准实际上定义了“实现”,它是指:一组特定的软件,在特定的控制选项下在特定的翻译环境中运行,为特定的执行环境执行程序翻译并支持功能执行。

对于不熟悉该语言标准的人来说,这可能看起来很神秘(事实上,甚至对于熟悉该语言的人而言,该标准的某些部分也显得很神秘)。
该语句或多或少地说明了实现是在特定环境中将 C 代码转换为可执行文件的软件。
这样说可能要比标准的定义好理解,但可能不够准确。

C 语言的规范与实现(语言标准规范事情的人) 排名链接
(图片来自网络侵删)
规范与实现的差异

现在,C 标准规定了 C 的实现需要遵守的各种事情,以及实现可以自行决定的某些事情。
例如,C 标准规定 int 必须能够保存的值范围为 -32767 到 +32767。
如果一个同学为 C 制作了一个编译器或解释器,该编译器或解释器给出的整数范围为 -100 到 +100,那么这位同学的 C 实现就不是有效的实现。
同样,如果他的编译器支持的整数范围是 -100000 到 +100000,那么这就是有效的,但是你不能依赖这种假设。

另一方面,C 标准规定,实现可以决定 char 是有符号的还是无符号的。
因此,如果一个实现决定让一个字符是有符号的,而另一个实现决定让字符是无符号的,那么这两种实现都是有效的。

最后,标准规定对 NULL 指针解引用的操作是未定义的行为。
这意味着,你的特定实现可能什么都不会发生,也可能导致你的计算机宕机。

不同实现上软件可能崩溃

看到这个的许多人可能会想:“谁在乎呢?在我使用过并测试过我的程序的所有计算机上都会发生同样的事情,事情就是这样。
”好吧,这是一个乐观的想法,如果事情就是这样运作的,世界可能会变得更好,但不幸的是,这不是真的。
将所使用的有限数量的 C 实现与 C 的所有实现的集合相混淆,很可能会导致编写出在不可预测的条件下崩溃的软件。

fflush

函数 fflush 是对不同实现的一个简单演示。
根据 ISO C11 标准的草案,如果 fflush 用于输出流以外的任何内容,那么它的作用是未定义的。

如上所述,未定义的行为意味着任何事情都可能发生。
所以,如果 stdin 被给予 fflush,任何事情都可能发生。
在微软的 fflush 实现中,stdin 中的所有数据都会被删除,清空缓冲区。
然而,大多数 UNIX 实现甚至没有定义在这种情况下会发生什么,从而导致任何事情都可能发生。

这种看似微小的差异会直接影响你的代码。
如果 fflush 不能清空 stdin,它将改变你处理从 stdin 读取和删除数据的方式。
例如,当 scanf 无法转换值时,它会将其保留在缓冲区中。
如果无法将此无效数据从 stdin 中移除,那么该如何将其移除呢?

执行速度

实现与规范发挥作用的另一个例子是关于语言速度的讨论。
人们不使用某些语言的一个原因是“X 语言太慢”。
对于那些对编程一时兴起的人来说,这句话会让他们脊背发凉。
语言是由其规范定义的,但这只是一个想法,与速度无关。
另一方面,语言的实现却与执行速度有关系。

沿着类似的思路,许多人会说他们不想使用 X 语言,因为它是解释性的。
同样,快或慢取决于语言的实现。
虽然太多人认为这些问题听起来很愚蠢,也许确实如此,但人们至少应该温和地意识到这是有区别的。
更正确的说法是,C 的大多数实现比 X 语言的大多数实现更快。

#头条创作挑战赛##C语言每日小知识#

标签:

相关文章