我在将一个整数传递给函数时递减整数。但我看到一些意想不到的行为。我是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
的第一次呼叫按预期工作,但第二次和第三次呼叫的处理是什么?
答案 0 :(得分:1)
这是未定义的行为,你不能指望任何结果。
答案 1 :(得分:1)
未指定函数参数的计算顺序。例如。 GCC喜欢从右到左计算参数值。如果您有一个修改变量的运算符(或具有任何其他副作用),则该运算符与使用该变量的任何其他表达式之间必须有sequence point。
答案 2 :(得分:-2)
由于参数从右侧传递函数,因此在第一次调用时使用后增量运算符 - 它传递相同的值(3)并更新'i'左参数(2)的值。
在第二次调用时,你使用了预增量运算符,它为自己的参数改变了自己的参数并发送了左参数的更新值。