0

这是一个在函数参数中使用副作用的递归代码。在 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:输出是分段错误

4

2 回答 2

3

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

于 2012-06-04T04:53:22.727 回答
2

所有的副作用都完成了,所以在函数调用之前改变了 i 和 j 的值。

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

于 2012-06-04T04:07:50.193 回答