【问题标题】:Can someone explain what is going on in this code? (arrays) [closed]有人可以解释这段代码中发生了什么吗? (数组)[关闭]
【发布时间】:2015-02-04 20:37:06
【问题描述】:

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

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

【问题讨论】:

  • 代码的哪一部分你不明白?全部?
  • 这看起来像学生测试。检查学生是否理解流程。
  • 如果您不了解递归,请检查:danzig.us/cpp/recursion.html
  • 打印数字 7 吗? (我刚刚阅读了代码..)
  • @tp1 是 6,但你是如何得到 7 的,我什至无法理解它是如何工作的。

标签: c++ arrays ternary-operator


【解决方案1】:

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

我对下面发生的事情进行了逐步解释(阅读风险自负):

  • 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%3 != 0) 评估为 false 并返回 3

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

  • 6 打印到标准输出

【讨论】:

  • 这就是我正在寻找的东西,非常感谢先生。
【解决方案2】:

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

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

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

【讨论】:

  • 感谢您的帮助,但我无法真正理解它是如何工作的部分。我的意思是如果你说 printf("bla bla");它会将 bla bla 带到您的屏幕上,这就是它的工作原理,或者如果您将 i++ 设置为 5,它会给您带来 4,但是这个编译为 6。但是如何?如果您有空闲时间,您能否逐步向我解释如何达到 6。再次感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-23
  • 2011-11-24
  • 1970-01-01
相关资源
最近更新 更多