请您报告一些在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_。