我试图理解这个,但没有机会。这个怎么运作?
#include <stdio.h>
int tavuk(int i)
{
return (i%3 != 0 ? i + tavuk(--i) : i);
}
void main(void)
{
int *p, array_a[]={5,2,4,7,3};
p = array_a;
printf("%d", tavuk(array_a[*(++p)]));
}
答案 0 :(得分:0)
最初p指向数组array_p的开头。 语句array_a [*(++ p)]可以按如下方式进行细分:
因此,将整数值2传递给tavuk方法。 从方法返回后,您将获得值5。
答案 1 :(得分:0)
您应该将一个调试器附加到程序中,放置一些断点并一次一行地执行它,这样您就可以看到代码发挥其魔力。也许在难以理解的表达式周围添加额外的括号和空格也可以帮到你。
我写了一步一步解释下面发生的事情(请自行承担风险):
p
指向array_a[]
p = array_a;
中的第一个元素
然后++p
执行,p
指向array_a
中的第二个元素(其地址返回到解除引用运算符*
)
*
返回数组中第二个字段的值(2)(因为++p
返回了array_a[1]
的地址)
现在检索array_a[2]
并将其值(4)传递到tavuk(...)
在tavuk(...)
(4%3 != 0)
内评估为真
--i
已执行(现在为i = 3
)
tavuk(...)
,其中(3%3 != 0)
的计算结果为false,返回3
递减的i
(3)被添加到第二个tavuk(...)
调用的返回值(也是3),并返回6
6打印到stdout