有人可以解释如何通过序列点评估这个C片段吗?

abj*_*shi 5 c expression

这是C下的未定义行为吗?我这样说是因为我认为该函数inc(int *k)可以被认为是一个表达式,其副作用是更新地址的值k.那么,这会使它等同于i=i++UB吗?

#include <stdio.h>
/*Edited(See comments below on dbush's answer)*/
int inc(int *k) {return ++(*k);}
/*End of edit*/
int main() 
{
  int i=0;
  int *ptr = &i;
  i = inc(ptr);
  printf("%d\n", i);
}
Run Code Online (Sandbox Code Playgroud)

dbu*_*ush 7

行为定义很明确,因为调用函数计为序列点,函数中的每个语句也是序列点.它是一样的,如果该函数的身体被放在它的位置.

首先inc叫.这会调用序列点.

在函数内,return ++(*k)执行语句,该语句首先计算包含的表达式.这导致imain得到递增到1,并且该表达式的的新值i,这是1.return语句返回从函数值,并且该声明完成是另一个序列中的点,所以递增的副作用i是保证完整.

返回后main,返回的值1将inc被分配给i.

如果你这样做了:

i = ++(*ptr);
Run Code Online (Sandbox Code Playgroud)

将是未定义的行为,因为在赋值i和递增ivia 的副作用之间没有序列点*ptr.