C 中实现定义的行为

Implementation-defined behavior in C

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

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

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

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

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

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

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

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

The result of E1 >> E2 is E1 right-shifted E2 bit positions. /--/ If E1 has a signed type and a negative value, the resulting value is implementation-defined.

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

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

上的操作代码 运行

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

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

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

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

这还举了另一个例子:

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

可能导致 o 成为 NULL 或唯一指针(如 C99 标准的 7.20.3 中指定)。