函数参数的副作用

时间:2012-06-04 04:02:44

标签: c

这是一个在函数参数中使用副作用的递归代码。在K& R中,我发现了一个语句 说C标准指定参数的所有副作用在调用函数之前生效(第54页K& R第二版)。但输出到上面的代码是矛盾的。可以有人帮助我。

void reverse(int* array,int i,int j)
{
  `int temp;
  if(i>j)

    return ;
  else{
    temp=array[i];
    array[i]=array[j];
    array[j]=temp;
    //i++;
    //j--;
    reverse(array,i++,j--);
  }
} '

PS:输出是分段错误

2 个答案:

答案 0 :(得分:3)

确实变量在函数调用之前递增,但是这些变量是声明它们的函数的本地变量(在这种情况下,是一个递归函数调用帧),当你使用后缀运算符时,运算符返回的值不是更新值,而是初始值。因此,您最终作为参数传递的值未正确更新,您的函数将永远不会终止。为了增加变量并同时返回和传入更新的值,您必须使用前缀运算符,即++i++j

答案 1 :(得分:2)

所有副作用都已完成,因此在函数调用之前会更改i和j的值。

但快递i++j--的值仍然是之前i和j的值。