有人可以解释一下这段代码中发生了什么吗?(数组)

Can someone explain what is going on in this code? (arrays)

本文关键字:数组 代码 发生了 什么 段代码 一下 解释      更新时间:2023-10-16

我试图理解这个,但没有机会。它是如何工作的?

    #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)])); 
    }
您应该将

调试器附加到程序,放置一些断点并一次单步执行一行,以便您可以观看代码发挥其魔力。也许在难以辨认的表达式周围添加额外的括号和空格也会对您有所帮助。

我写了一个分步解释下面发生的事情(阅读风险

自负(:
  • p指向p = array_a;之后array_a[]的第一个元素

  • 然后执行++pp指向array_a中的第二个元素(其地址返回到取消引用运算符 * (

  • * 返回数组中第二个字段的值 (2((因为++p返回了 array_a[1] 的地址(

  • 现在检索array_a[2]并将其值 (4( 传递到 tavuk(...)

  • 内部tavuk(...) (4%3 != 0)计算结果为 true

  • --i已执行(现在i = 3(

  • tavuk(...) 用 3 调用,在它里面(3%3 != 0)计算为 false,返回 3

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

  • 6 打印到 stdout

最初 p 指向数组array_p的开头。语句 array_a[*(++p(] 可以分解如下:

  • ++p ==> 增量指向下一个内存地址,在本例中地址为 array_p[1]
  • *(++p( ==> 此地址处的整数值,在本例中为 2 或 array_p[1]

因此,将整数值 2 传递给 tavuk 方法。从该方法返回后,您将获得值 5。