这是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)
行为定义很明确,因为调用函数计为序列点,函数中的每个语句也是序列点.它是不一样的,如果该函数的身体被放在它的位置.
首先inc叫.这会调用序列点.
在函数内,return ++(*k)执行语句,该语句首先计算包含的表达式.这导致i在main得到递增到1,并且该表达式的的新值i,这是1.return语句返回从函数值,并且该声明完成是另一个序列中的点,所以递增的副作用i是保证完整.
返回后main,返回的值1将inc被分配给i.
如果你这样做了:
i = ++(*ptr);
Run Code Online (Sandbox Code Playgroud)
这将是未定义的行为,因为在赋值i和递增ivia 的副作用之间没有序列点*ptr.