2014-07-20 5 views
0

Как значение 1 передается в оператор if в основной функции и как работает функция возврата с рекурсивным вызовом?Как функция return возвращает значение в оператор If?

#include <stdio.h> 
#include <stdlib.h> 
int identicalTrees(struct node* a, struct node* b) 
    { 
if (a==NULL && b==NULL) 
    return 1; 

if (a!=NULL && b!=NULL) 
{ 
    return 
    (
     a->data == b->data && 
     identicalTrees(a->left, b->left) && 
     identicalTrees(a->right, b->right) 
    ); 
} 

return 0; 
} 




int main() 
{ 
if(identicalTrees(root1, root2)) 
    printf("Both tree are identical."); 
else 
    printf("Trees are not identical."); 

getchar(); 
return 0; 
} 
+1

Что такое функция возврата? 'return' не является функцией, это утверждение. И он возвращает значение вызывающему, потому что это говорит об определении языка. –

+0

Есть несколько отличных видеороликов, которые объясняют, как рекурсия и стек работают на канале Computerphile на youtube. Вы должны смотреть на них всех. https://www.youtube.com/watch?v=Mv9NEXX1VHc, https://www.youtube.com/watch?v=TrfcJCulsF4, https://www.youtube.com/watch?v=7t_pTlH9HwA, https: //www.youtube.com/watch?v=7ha78yWRDlE, https://www.youtube.com/watch?v=S_NXz7I5dQc – SpiderPig

+1

Вы определенно хотите прочитать о [стек вызовов] (https: //en.wikipedia. орг/вики/Call_stack). –

ответ

4

Когда метод, который был объявлен возвращать значение называется пространство резервируется в стеке для возвращаемого значения каждый раз, когда этот метод называется. Оператор Return помещает значение в эту позицию в стек и выходит из метода, возвращаемого обратно к коду, который вызвал метод. Код, который вызвал метод, извлекает значение, помещенное в стек, с помощью инструкции Return и использует ее в операторе If.

В рекурсии каждый последующий вызов метода имеет собственное локальное пространство переменных стека, добавленное в верхнюю часть стека. Когда метод выполняется, текущий верхний указатель стека уменьшается до «свободного» пространства стека этого метода.

См. http://en.wikipedia.org/wiki/Stack-oriented_programming_language и http://en.wikipedia.org/wiki/Recursion_(computer_science) и https://www.cs.umd.edu/class/fall2002/cmsc214/Tutorial/recursion2.html для более подробных объяснений.

+0

спасибо Майк .. – user3815757

+2

Это один из способов делать вещи. Возвращение через регистр, вероятно, более распространено. –

+0

@ user3815757 см. Также [Wikipedia: Calling convention] (http://en.wikipedia.org/wiki/Calling_convention) и связанные с ним страницы, например. [Википедия: соглашения о вызовах x86] (http://en.wikipedia.org/wiki/X86_calling_conventions) в главе cdecl говорит _ ".. Целочисленные значения и адреса памяти возвращаются в регистре EAX, значения с плавающей запятой в регистре ST0 x87 .. "_ – xmojmr

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

  • Нет связанных вопросов^_^