涉及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 = %d\n", x1 );
printf( "x = %d\n", x );
}
int main(void)
{
foo( x++ );
return 0;
}
它的输出是
x1 = 0
x = 1
因此,可以看出,表达式x++
的值是递增前操作数的值
x1 = 0
然而,在函数获得控制之前应用了副作用
x = 1
该程序格式正确,没有未定义的行为。
每当使用后增量时,变量的原始值将被发送到函数。之后,x的值将递增。