2014-12-09 6 views
2
#include<stdio.h> 

find(int x, int y) 
{ 
    return((x<y)?0:(x-y)); 
} 

int main(void) 
{ 
    int a=find(5,find(5,4)); 
    printf("%d",a); 

    return 0; 
} 

Вышеуказанная программа дает результат как 4. Я бежал с разными значениями и узнал, что фрагмент кода должен найти минимальное количество двух чисел. Но я не могу понять, как он работает. Может ли кто-нибудь объяснить это мне? Я знаю, как работает троичный оператор, я не получил вызов функции внутри функции вызова.C программирование сомнений- вызов функции внутри функции вызов функции

+1

я удивлен видеть, никто не советовал вам явно указать тип возвращаемого значения '' функции поиска() .... , –

ответ

2
int a=find(5,find(5,4)); 

find(5,4) returns 1 

find(5,1) returns 4 

Сначала функция find() запускается с параметрами 5 и 4 в качестве параметров. которая будет вызывать x<y состояния потерпеть неудачу и возвращает x-y, который 5-4 =1

Позже у вас есть find(5,1) что снова делает условие x<y неудачу возвращения 5-1 которого 4

1

Что там «получить»?

Вызов функции, как и любой другой вызов, оценивается как «наизнанку». Все значения аргументов должны быть известны до того, как будет выполнен вызов. Итак, второй аргумент - find(5,4), поэтому вызов происходит первым. Тогда значение этого вызова используется как аргумент во втором, внешнем, вызове.

2

Попробуйте сломать его. Смотрите так.

когда вы говорите int a=find(5,find(5,4)); затем функция поиска внутри функции поиска i.e find(5,4) возвращает 1; Теперь полученное значение делает его int a=find(5, 1); И когда найти find(5,1); называется он возвращает 4 :)

1

Чтобы добавить к ранее данные ответы, это всегда лучше явно указать тип возвращаемого значения функции.

Изменение find() функции подписи

int find(int x, int y); 

Далее, относительно порядка выполнения функции, поток inside-out, значит, внутренняя функция будет выполняться первым, возвращаемое значение будет использоваться для выполнения внешнее вызов.

диаграммно,

int a=find(5,find(5,4)); 

можно разложить

int a=find(5,find(5,4));  //consider step 1.0 

      |     /*inner find() executes first, returns 1*/ 
      V 

    int a=find(5, 1 /*result of find(5,4)*/);  //consider step 1.1 

       |     /*result of inner find() used for outer find()*/ 
       V 

     int a=find(5, 1));  //consider step 1.2 

       |    /*outer find() executes second, returns 4*/ 
       V 

       int a= 4;  //consider step 1.3 
           /* value 4 is assigned to a*/