在涉及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 的值将递增。