未定义或未指定的行为?

inf*_*tic 13 c standards language-lawyer

我正在阅读本文,他们使用以下示例来解释未定义的行为:

// 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; 
}
Run Code Online (Sandbox Code Playgroud)

但是,它似乎是关于子表达式的评估顺序,并且根据C标准(附件J.1),它是一个未指定的行为,而不是未定义的行为:

未指定的行为:评估子表达式的顺序以及副作用发生的顺序,除非为function-call(),&&,||指定.,?:和逗号运算符(6.5)

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

hac*_*cks 7

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

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

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

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

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

c = a + b;
Run Code Online (Sandbox Code Playgroud)

表达式中的评估顺序ab未指定a + b.

  • 写入stdout是副作用恕我直言,但在`f1`和`f2`中有副作用的事实不会产生未定义的行为. (5认同)