Return 带逻辑运算符的值

Return value with logic operators

任何人都可以向我解释一下这个 return 在有逻辑运算符的情况下是如何工作的吗?还要解释一下这个函数什么时候去 return 本身和数组元素?

#include<stdio.h>
int consecutive_3(int x, int y, int z, int a[], int n)
{
    if(n<3)
       return 0;
    return ((a[n-3] == x) && (a[n-2] == y) && (a[n-1] == z)) || consecutive_3(x, y, z, a, n-1);
}

应该一样

int consecutive_3(int x, int y, int z, int a[], int n)
{
    if (n < 3)
       return 0;

    if ((a[n-3] == x) && (a[n-2] == y) && (a[n-1] == z))
       return 1;

    return consecutive_3(x, y, z, a, n - 1);
}

注意:c 从左到右计算逻辑表达式,&&||.

有一个 higher precedence(先计算)

how does return works in this case when there is logic operator

return 没有什么特别之处 - 它只是 returns 表达式计算后的值。

所以在你的情况下:

return ((a[n-3] == x) && (a[n-2] == y) && (a[n-1] == z)) || consecutive_3(x, y, z, a, n-1);

一样
int temp = ((a[n-3] == x) && (a[n-2] == y) && (a[n-1] == z)) || consecutive_3(x, y, z, a, n-1);
return temp;

when this function is going to return itself and when array elements

它从不做任何这些。它总是 returns 一个整数。

这个想法似乎是该函数通过数组查找 3 个具有值 xyz 的连续元素。

如果找到了 returns 1.

如果未找到,它会调用自身,但会查看数组中的新点,即下一个较低的数组索引。这一直持续到搜索完整个数组。

如果还没有找到 returns 0。这就是 if (n < 3) return 0; 的作用。

所以假设数组:

int a[] = {1, 2, 3, 4, 5, 6};

和函数调用

consecutive_3(1, 2, 3, a, 6);

那么你有这样的

 Is 1, 2, 3 equal 4, 5, 6 No, so call again
 Is 1, 2, 3 equal 3, 4, 5 No, so call again
 Is 1, 2, 3 equal 2, 3, 4 No, so call again
 Is 1, 2, 3 equal 1, 2, 3 Yes, return 1

来电了吗

consecutive_3(10, 2, 3, a, 6);

会是

 Is 10, 2, 3 equal 4, 5, 6 No, so call again
 Is 10, 2, 3 equal 3, 4, 5 No, so call again
 Is 10, 2, 3 equal 2, 3, 4 No, so call again
 Is 10, 2, 3 equal 1, 2, 3 No, so call again
 No more unchecked elements so return 0

此函数检查数组a[]中从索引0到n-1是否有3个连续的数字x y z。它 returns 0(未找到)或 1(找到)。

首先,进行超出范围的检查:

if (n < 3)
   return 0;  // there are less than 3, can not match

然后,测试最后三个数字:

return ((a[n-3] == x) && (a[n-2] == y) && (a[n-1] == z)) (|| ...)

如果三个都匹配,则 returns 1 作为值。但如果不是,则 return 是 || 后表达式的右侧部分(逻辑或)。

该部分再次调用相同的函数,但缩短了数组,因此它再次测试缩短数组的最后 3 个。

理解这一点的关键是 return 在两个兼容的备选方案(均为布尔值)之间进行选择;第一个是预期的(但部分)测试,第二个是对不同数据执行的预期测试,仅当第一个失败时。

这是一个聪明的系统,但由于一次又一次调用自身、强调堆栈和传递参数的开销,所以速度不是很快;单个 for 循环本来就很简单,而且速度更快。