未定义或未指定的行为?

时间:2017-07-21 15:41:28

标签: c language-lawyer standards

我正在阅读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)

由于我对阅读官方规范非常陌生,所以我想知道我是否误解了这个例子或文档。我知道这看起来很迂腐,但我对以正确的方式学习这些高级主题感兴趣。

1 个答案:

答案 0 :(得分:7)

您在问题中提供的链接会给出错误的未定义行为示例。 f1中对f2f1() + f2()的评估将不详。请注意,标准说明副作用以及评估顺序

  

评估子表达式的顺序和发生副作用的顺序 [...]

评估f1f2时的副作用(输出到标准输出)不相关,它们不会导致任何未定义的行为。

这与下面的例子没什么不同

int a = 1;
int b = 1, c;

c = a + b;

表达式a中未指定ba + b的评估顺序。