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

问题描述 投票:1回答:3

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

电话:

foo(x++, y);

功能 :

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

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

c increment function-call
3个回答
11
投票

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

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

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

关于函数调用,章节§6.5.2.3

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

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

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

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

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

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


1
投票

考虑以下程序

#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

该程序格式正确,没有未定义的行为。


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.