2014-12-06 66 views
-2

我试图理解这个,但没有机会。怎么运行的?有人可以解释在这段代码中发生了什么吗? (数组)

#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

这是代码的一部分,你不明白吗?所有的? – Kelm 2014-12-06 21:37:14

+1

这看起来像学生考试。检查学生是否理解流程。 – i486 2014-12-06 21:54:08

+1

@凯尔姆伤心地,是的。 – someonetesting 2014-12-06 22:02:44

回答

0

您应该在程序中附加一个调试程序,放置一些断点并一次一行地浏览它,以便您可以观察代码的功能。也许围绕难以辨认的表达式添加额外的括号和空格也可以帮助你。

我写了一步步的东西(风险自担阅读)以下情况一步的解释:后p = array_a;

  • 然后++p

    • p指向array_a[]的第一个元素被执行并且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被打印到stdout

  • +0

    这是我正在寻找的东西,非常感谢您的先生。 – someonetesting 2014-12-06 22:40:23

    0

    最初p指向数组array_p的开始。 声明array_a [*(++ P)]可以被分解如下:

    • ++ p ==>增量指向下一个存储器地址,在array_p的这种情况下,地址[1]
    • *(++ p)==>在这个地址的整数值,在这种情况下2或array_p [1]

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

    +0

    感谢您的帮助,但我无法真正理解它是如何工作的部分。我的意思是如果你说printf(“bla bla”);它给你的屏幕带来了难以置信的效果,或者如果你做了++ 5,它会带给你一个4,但是这个编译为6,但是怎么做?如果你有空闲时间,你可以一步步向我解释,以达到这一点6.再次感谢。 – someonetesting 2014-12-06 22:12:08

    相关问题