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

+1

Это похоже на студенческий тест. Чтобы проверить, понимают ли студенты поток. – i486

+1

@ Келм печально, да. – someonetesting

ответ

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)

  • tavuk(...) вызываются с 3, внутри него (3%3 != 0) принимает значение лжи, и 3 возвращаются

  • уменьшенным i (3) добавляются к возвращаемому значению второго tavuk(...) вызова (также 3) и 6 возвращаются

  • 6 выводится на стандартный вывод

+0

Это то, что я ищу, большое спасибо, сэр. – someonetesting

0

Первоначально p указывает на начало массива array_p. В заявлении array_a [* (++ р)] можно разбить следующим образом:

  • ++ р ==> Точка приращения к следующему адресу памяти, в этом случае адрес array_p [1]
  • * (++ p) ==> целочисленное значение по этому адресу, в этом случае 2 или array_p [1]

Следовательно, вы передаете целочисленное значение 2 методу tavuk. По возвращении из метода вы получите значение 5.

+0

Спасибо за вашу помощь, но я не могу понять, как это работает. Я имею в виду, если вы скажете printf («bla bla»); он приносит bla bla на ваш экран, как это работает, или если вы делаете i ++ до 5, он принесет вам 4, но этот компилирует 6. Но как? Если у вас есть свободное время, вы можете объяснить мне шаг за шагом, чтобы достичь этого. Еще раз спасибо. – someonetesting

Смежные вопросы