请问,您能否报告一些 C 中实现定义的行为的示例?
例如,我从标准中知道“实现定义的行为是有符号整数右移时高位的传播”。
你能给我解释一下这个例子的意义并举个例子吗?
我明白了int i; i >> 3
。但是为什么这是实现定义的呢?
请问,您能否报告一些 C 中实现定义的行为的示例?
例如,我从标准中知道“实现定义的行为是有符号整数右移时高位的传播”。
你能给我解释一下这个例子的意义并举个例子吗?
我明白了int i; i >> 3
。但是为什么这是实现定义的呢?
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 也是如此。
之所以定义它的实现,是因为 C 标准委员会拒绝定义应该发生的事情。他们这样做的原因是因为不同的 CPU 在这种情况下会做不同的事情,而 C 的精神(为了快速执行)是不要在 C 源代码和运行在中央处理器。
他们本可以选择定义标准行为,但随后在一些 CPU 上需要编译器生成大量代码以弥补 CPU 自己的操作码不提供标准化行为的事实。虽然完全有可能,但它不可避免地不会非常有效。
其他人无疑将能够指出该解释的更权威版本!
任何依赖于实现定义行为的代码只能保证在特定平台和/或编译器下工作。便携式程序应尽量避免此类行为。
根据:https ://clc-wiki.net/wiki/C_language:Terms:Implementation-defined_behaviour
这也给出了另一个例子:
int *o = malloc(0 * sizeof *o);
可能导致o
存在NULL
或唯一指针(如 C99 标准 7.20.3 中所指定)。