2014-12-06 64 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

    相關問題