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 个具有值 x
、y
和 z
的连续元素。
如果找到了 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 循环本来就很简单,而且速度更快。
任何人都可以向我解释一下这个 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 从左到右计算逻辑表达式,&&
比 ||
.
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 个具有值 x
、y
和 z
的连续元素。
如果找到了 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 循环本来就很简单,而且速度更快。