return语句中的奇怪表达式

时间:2014-11-15 18:21:45

标签: c recursion return

我发现了一个递归函数,让我有点惊讶这个函数统计出现在数组中的所有负数:

int count_negative(int arr[], int n)
{
  if ( n > 0 )
    return (*arr < 0) + count_negative( ++arr, n - 1 );
  return 0;
}

有人可以解释这一行:

return (*arr < 0) + count_negative( ++arr, n-1 );

谢谢

3 个答案:

答案 0 :(得分:6)

(*arr < 0)将数组的第一个元素与零进行比较。表达式的结果可以是1(第一个元素是负数)或0(第一个元素是正数或零)。因此,负数元素的数量是该表达式与数组尾部负数元素数之和。

答案 1 :(得分:3)

*arr指向arr数组的第一个元素(或者更准确地说,是在此特定调用中传递给函数的arr部分)。

count_negative( ++arr, n-1 )是递归调用但由于++arr,在此调用中我们计算数组的下一个元素和n-1参数,并使用if ( n > 0 )保证我们只计算arr数组中的元素。

答案 2 :(得分:2)

原则是,不是在被检查的元素上保留索引,因为arr是指针并且修改它不会改变数据,而是可以使用arr本身作为迭代器数组数据。

因此,*arr < 0检查当前指向的元素是否为负数(如果是,它将产生1,如果不是则产生0),并且++arr将光标增加到数组中的下一个位置,然后递归传递以检查数组的其余部分。

这是使用列表的函数式语言中一个众所周知的想法,在这些列表中,您经常处理列表的第一个元素( head )并递归列表的剩余部分(< EM>尾)。