1

请问,您能否报告一些 C 中实现定义的行为的示例?

例如,我从标准中知道“实现定义的行为是有符号整数右移时高位的传播”。

你能给我解释一下这个例子的意义并举个例子吗?

我明白了int i; i >> 3。但是为什么这是实现定义的呢?

4

3 回答 3

2

C 中实现定义的行为的定义是当某些事情留给编译器决定时,编译器会记录它做出的选择。

语言中有数百个这样的案例。该标准在附件 J.3 中包含其中大部分内容的摘要,大约 15 页长。

具体示例int i; i >> 3是未定义的行为,因为变量未初始化。

具体示例int i=0; i >> 3是实现定义的,因为标准是这样说的。C17 6.5.7/5:

结果E1 >> E2是 E1 右移的E2位位置。/--/ 如果E1具有带符号类型和负值,则结果值是实现定义的。

在这种特殊情况下,这取决于编译器是从 CPU 指令集中选择算术移位指令还是逻辑移位指令。这意味着该标准并不反对缺乏算术移位的架构。尽管在实践中,绝大多数 CPU 都能够进行算术移位,甚至 RISC 也是如此。

于 2020-04-02T11:35:00.820 回答
1

之所以定义它的实现,是因为 C 标准委员会拒绝定义应该发生的事情。他们这样做的原因是因为不同的 CPU 在这种情况下会做不同的事情,而 C 的精神(为了快速执行)是不要在 C 源代码和运行在中央处理器。

他们本可以选择定义标准行为,但随后在一些 CPU 上需要编译器生成大量代码以弥补 CPU 自己的操作码不提供标准化行为的事实。虽然完全有可能,但它不可避免地不会非常有效。

其他人无疑将能够指出该解释的更权威版本!

于 2020-04-02T11:35:09.443 回答
1

任何依赖于实现定义行为的代码只能保证在特定平台和/或编译器下工作。便携式程序应尽量避免此类行为。

根据:https ://clc-wiki.net/wiki/C_language:Terms:Implementation-defined_behaviour

这也给出了另一个例子:

int *o = malloc(0 * sizeof *o);

可能导致o存在NULL或唯一指针(如 C99 标准 7.20.3 中所指定)。

于 2020-04-02T11:35:54.793 回答