我正在阅读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),它是一个未指定的行为,而不是未定义的行为:
未指定的行为:评估子表达式的顺序以及副作用的顺序 发生,除了为函数call(),&amp;&amp;,||指定的,? :和逗号 运营商(6.5)
由于我对阅读官方规范非常陌生,所以我想知道我是否误解了这个例子或文档。我知道这看起来很迂腐,但我对以正确的方式学习这些高级主题感兴趣。
答案 0 :(得分:7)
您在问题中提供的链接会给出错误的未定义行为示例。 f1
中对f2
和f1() + f2()
的评估将不详。请注意,标准说明副作用以及评估顺序
评估子表达式的顺序和发生副作用的顺序 [...]
评估f1
和f2
时的副作用(输出到标准输出)不相关,它们不会导致任何未定义的行为。
这与下面的例子没什么不同
int a = 1;
int b = 1, c;
c = a + b;
表达式a
中未指定b
和a + b
的评估顺序。