c语言 - foo(x++, y) :: x 是否总是在作为参数发送后递增?



在涉及x++的表达式的情况下,增量是否总是在要复制到函数的变量之后进行?

电话 :

foo(x++, y);

函数:

int foo(int x, int y)
{
return x*y;
}

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

让我们在这里看看官方描述,以获得更深入的理解。

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

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

关于函数调用,第 §6.5.2.3 章

在功能指示符和实际的评估之后有一个序列点 参数,但在实际调用之前。调用函数中的每个评估(包括 其他函数调用),未在 被调用函数主体的执行是不确定的顺序,相对于 被调用函数的执行。

因此,根据上面的描述,如上所示,您的代码中没有任何问题。

传递旧的x值,然后增加该值。

但是,请注意第二个引号的最后一部分,您需要保持代码的健全性。例如,您需要确保,如果中间没有序列点,则值不会发生变化。 类似的东西

foo(x++, x++, y);

这将是一个问题,因为您正在尝试多次更改相同的变量(x)。

考虑以下程序

#include <stdio.h>
int x;
void foo(int x1 )
{
extern int x;
printf( "x1 = %dn", x1 );
printf( "x = %dn", x );
}
int main(void) 
{
foo( x++ );
return 0;
}

它的输出是

x1 = 0
x = 1

因此,可以看出,表达式x++的值是递增之前操作数的值

x1 = 0

但是,在函数获得控件之前应用了副作用

x = 1

程序格式良好,没有未定义的行为。

每当使用后增量时,变量的原始值将被发送到函数。之后,x 的值将递增。

最新更新