foo(x ++,y):: x作为参数发送后总是递增吗?

Col*_*gon 1 c increment function-call

表达式的增量是否x++总是在变量复制到函数之后进行?

电话:

foo(x++, y);
Run Code Online (Sandbox Code Playgroud)

功能 :

int foo(int x, int y)
{
   return x*y;
}
Run Code Online (Sandbox Code Playgroud)

这是所有编译器的未定义行为吗?

Sou*_*osh 10

让我们看一下这里的官方描述,以便更深入地了解.

对于后缀运算符,引用C11,章节§6.5.2.3

后缀++运算符的结果是操作数的值.作为副作用,操作数对象的值递增(即,将相应类型的值1添加到其中).[...]在更新操作数的存储值的副作用之前,对结果的值计算进行排序.

关于函数调用,章节§6.5.2.3

在评估函数指示符和实际参数之后但在实际调用之前有一个序列点.调用函数(包括其他函数调用)中的每个评估(在执行被调用函数的主体之前或之后没有特别排序)对于被调用函数的执行是不确定地排序的.

因此,如上所述,您的代码中没有任何问题,如上所示.

x传递旧值,然后增加值.

但是,请注意第二个引用的最后一部分,您需要保持代码的完整性.例如,您需要确保在没有序列点之间没有值的变化.就像是

 foo(x++, x++, y);
Run Code Online (Sandbox Code Playgroud)

将是一个问题,因为你试图x不止一次地改变同一个变量().