【发布时间】:2017-12-27 17:50:57
【问题描述】:
我正在阅读this article,他们使用以下示例来解释未定义的行为:
// PROGRAM 1
#include <stdio.h>
int f1() { printf ("Geeks"); return 1;}
int f2() { printf ("forGeeks"); return 1;}
int main()
{
int p = f1() + f2();
return 0;
}
但是,这似乎与评估子表达式的顺序有关,并且根据 C 标准(附件 J.1),这是未指定的行为,而不是未定义的行为:
未指定的行为:评估子表达式的顺序和副作用的顺序 发生,除非为函数调用 () , &&, || 指定, ? : 和逗号 运营商 (6.5)
由于我对阅读官方规范非常陌生,我想知道我是否误解了示例或文档。我知道这可能看起来很迂腐,但我有兴趣以正确的方式学习这些高级主题。
【问题讨论】:
-
“解释未定义行为的示例”:显示的代码不调用“未定义的行为”。
-
@parallelhighway:错了。正如 OP 所假设的,它明确是未指定,而不是未定义的行为。
-
这个短语是不正确的,根据@Olaf 的说法:“程序 1 中未定义行为的原因是,运算符 '+' 对其操作数没有标准定义的求值顺序。”跨度>
-
@Olaf 你是对的,我在文章中也感到困惑。这篇文章混淆了这些术语。
-
@parallelhighway:维基百科是一个糟糕的标准解释资源。标准行为只有一种权威资源:标准。
标签: c language-lawyer standards