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 中指定)。
请问,您能否报告一些 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-shiftedE2
bit positions. /--/ IfE1
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 中指定)。