这是一个在函数参数中使用副作用的递归代码。在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:输出是分段错误
答案 0 :(得分:3)
确实变量在函数调用之前递增,但是这些变量是声明它们的函数的本地变量(在这种情况下,是一个递归函数调用帧),当你使用后缀运算符时,运算符返回的值不是更新值,而是初始值。因此,您最终作为参数传递的值未正确更新,您的函数将永远不会终止。为了增加变量并同时返回和传入更新的值,您必须使用前缀运算符,即++i
和++j
。
答案 1 :(得分:2)
所有副作用都已完成,因此在函数调用之前会更改i和j的值。
但快递i++
和j--
的值仍然是之前i和j的值。