在同一函数调用中传递多个副本时减少int

时间:2013-07-13 06:34:40

标签: c

我在将一个整数传递给函数时递减整数。但我看到一些意想不到的行为。我是C的新手,不知道该怎么做:

#include <stdio.h>

void func(int, int);

int main(){
        int i=3;
        //func(i--, i); //Prints a=3, b=2
        func(i, i--); //Prints a=2, b=3 ??
        func(i, --i); //Prints a=2, b=2 ??
}

void func(int a, int b){ 
        printf("a=%d\n", a); 
        printf("b=%d\n", b); 
}

func的第一次呼叫按预期工作,但第二次和第三次呼叫的处理是什么?

3 个答案:

答案 0 :(得分:1)

这是未定义的行为,你不能指望任何结果。

答案 1 :(得分:1)

未指定函数参数的计算顺序。例如。 GCC喜欢从右到左计算参数值。如果您有一个修改变量的运算符(或具有任何其他副作用),则该运算符与使用该变量的任何其他表达式之间必须有sequence point

答案 2 :(得分:-2)

由于参数从右侧传递函数,因此在第一次调用时使用后增量运算符 - 它传递相同的值(3)并更新'i'左参数(2)的值。

在第二次调用时,你使用了预增量运算符,它为自己的参数改变了自己的参数并发送了左参数的更新值。