有人可以解释这段代码中发生了什么吗? (阵列)

时间:2014-12-06 21:35:32

标签: c++ arrays ternary-operator

我试图理解这个,但没有机会。这个怎么运作?

    #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)])); 
    }

2 个答案:

答案 0 :(得分:0)

最初p指向数组array_p的开头。 语句array_a [*(++ p)]可以按如下方式进行细分:

  • ++ p ==&gt;递增指向下一个存储器地址,在本例中为array_p [1]
  • 的地址
  • *(++ p)==&gt;此地址的整数值,在本例中为2或array_p [1]

因此,将整数值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

  • 使用3调用
  • tavuk(...),其中(3%3 != 0)的计算结果为false,返回3

  • 递减的i(3)被添加到第二个tavuk(...)调用的返回值(也是3),并返回6

  • 6打印到stdout