C语言|关于c语言函数问题

定义一个fun函数,在主函数定义i=8,出现fun(i+=3,i-=2)时,为什么是相当于fun(9,9)

VC++环境

建议看反汇编码。
VC++ 环境下会先把一个函数参数的所有表达计算完,再装入函数。
所以上式等价于:
i+=3;
i-=2;
fun(i, i);

它会先将赋值语句全部计算后,再将i作为参数传递给fun参数。计算后 i等于9,所以两个参数就都是9了

该回答引用GPTᴼᴾᴱᴺᴬᴵ
在 VC++ 环境中,按照 C++ 的运算规则,函数参数的传递顺序是不确定的。因此,在 fun(i+=3, i-=2) 中,i+=3 和 i-=2 的执行顺序是不确定的。有些编译器可能是先执行 i+=3,有些编译器可能是先执行 i-=2。

假设编译器先执行 i+=3,然后再执行 i-=2,则会发生如下过程:

1、i+=3 等价于 i=i+3,即将 i 的值加上 3,此时 i 的值为 11。
2、i-=2 等价于 i=i-2,即将 i 的值减去 2,此时 i 的值为 9。
3、fun(i+=3, i-=2) 等价于 fun(11, 9),即将 11 和 9 作为参数传递给函数。
因此,如果编译器先执行 i+=3,再执行 i-=2,则会得到 fun(11, 9)。

如果编译器先执行 i-=2,再执行 i+=3,则会得到 fun(9, 10)。

综上所述,函数调用 fun(i+=3, i-=2) 的结果取决于编译器对参数的计算顺序,可能得到不同的结果。

如果是fun(i+3,i-2),那么会先将两个表达式的值缓存到临时存储区,再作为实参传递给fun
而如果是fun(i+=3,i-=2),会先进行赋值运算,表达式的结果其实就是i本身,最终执行的是fun(i,i)