实现定义了C中的行为



请您报告一些在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上,需要编译器生成大量代码来弥补CPU自己的操作代码无法提供标准行为的事实。虽然这是完全可能的,但不可避免地效率不会很高。

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

任何依赖于实现定义行为的代码都只能保证在特定的平台和/或编译器下工作。可移植程序应该尽量避免这种行为。

根据:https://clc-wiki.net/wiki/C_language:Terms:Implementation-定义行为

这也给出了另一个例子:

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

可能导致CCD_ 8是CCD_。

相关内容

  • 没有找到相关文章

最新更新