|
|
1
39
引用第3.4.1节 the C standard 定义了“实现定义的行为”:
根据第3.4.4节定义“未指定行为”:
|
|
|
2
14
“未指定行为”和“实现定义”并不矛盾。这只是意味着C标准没有规定需要做什么,各种实现可以做他们认为“正确”的事情 那个特定的编译器 是一致的。在不同的编译器上可能会得到不同的结果。 |
|
3
2
实现定义的行为是 子类 未指定行为,即标准未规定的行为。 缺陷报告#154至C89询问委员会 implementation-defined behaviour ; 委员会回答说,实施可以定义它想要的任何行为,而不需要是恒定的。 实现需要做的是记录 怎样 这种选择是做出的,而不是另一类未指定的行为,在这种行为中,一致性实现甚至不需要费心说明 怎样 作出选择,可能是因为对于这些实现,文本中的大多数会说“随机”或“取决于编译器优化级别”或“取决于局部变量的寄存器分配”。 |
|
4
2
我现在没有得到任何答案。C标准明确指出,右移负数是 实现定义的行为 . 它是 不
记录其行为。时期 在实践中:文档必须告诉编译器是使用算术右移还是逻辑右移。 没有 需要记录。未指定的行为用于两种情况:
例如,编译器不需要在这样的代码中记录求值顺序:
记录子表达式的求值顺序将揭示编译器的内部表达式树和优化器如何工作的详细信息,这反过来又将揭示编译器为什么生成更好的代码或编译速度比竞争对手快。当C标准最初编写时,这是一件大事。如今,当有一些伟大的开源编译器时,情况就更糟了,所以这不再是一个秘密。
|