函数调用的序列点?

luc*_*rod 7 c c++ undefined-behavior sequence-points

这是另一个序列点问题,但是一个相当简单的问题:

#include <stdio.h>
void f(int p, int) {
  printf("p: %d\n", p);
}

int g(int* p) {
  *p = 42;
  return 0;
}

int main() {
  int p = 0;
  f(p, g(&p));
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

这是未定义的行为吗?或者调用g(&p)充当序列点?

Naw*_*waz 9

不.它不会调用未定义的行为.它只是未指定,因为在标准中未指定评估函数参数的顺序.因此输出可以是042取决于编译器决定的评估顺序.

  • 这个问题还询问`g(&p)`是否充当序列点.在评估"g(&p)"时有两个序列点:在评估"g"和评估"&p"之间,以及评估"完整表达式"之间`*p = 42;`和`return`中的`0`.但是他们都没有在"g(&p)"的评估中命令对参数"p"进行评估. (6认同)