2015-10-22 6 views
0

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

#define _CRT_SECURE_NO_WARNINGS 
#include <stdio.h> 

int logic(int a, int b) 
{ 
    int c = a % b; 
    a++; 
    b--; 
    printf("==%d %d %d==\n", a, b, c); 
    return b + a + c; 
} 

int main() 
{ 
    int a, c; 
    float d, f; 
    a = 10; 
    c = 5; 
    f = 2; 

    d = logic(a, logic(c, f)); 
    printf("%d %d %.2f %.2f\n", a, c, d, f); 
    return 0; 
} 

Теперь выход для этого:

'== 6 1 1== 
==11 7 2== 
10 5 20.00 2.00' 

Теперь проблема заключается в том, как это линия 'd = logic(a, logic(c, f));' компилировать в отношении логической функции выше. Я предполагаю, что для получения первого вывода логическая функция принимает значение 5 и 2 для c и f и запускает ее через функцию для a и b. Но я полностью зациклен на том, почему следующий вывод '==11 7 2=='. То, что возвращает 'c + b + a;', делает точно, когда я заменяю оператор + запятой, появляется только первое значение в выходе (которое равно 11 независимо от того, какой порядок я помещаю в переменные), остальные 0s.

Пожалуйста, помогите с этим, я невероятно тупик, были у него часами и до сих пор ничего.

+0

Я считаю, что есть недостающий кусок кода. Не могли бы вы добавить его и лучше уточнить, где вы не понимаете? –

+0

Нет, это все. Это точно соответствует тому, что указано выше. Я пытаюсь понять, как первый выход равен 6 1 1, но второй вывод 11 7 2, я не понимаю, как происходит второй выход. – Impugnor

+0

Обратите внимание, что здесь мы имеем дело с * двумя * наборами локальных переменных. Параметры 'logic()' называются 'a' и' b', но эти имена являются * локальными * для 'logic()' и не имеют ничего общего с 'a' и' b', объявленными в 'main() '. – JimmyB

ответ

0

Предполагаю, что для получения первого выхода логическая функция принимает значение 5 и 2 для c и f и запускает ее через функцию для a и b.

Это правильно. То, что происходит сначала, эквивалентно вызову logic(5, 2). Обратите внимание на две вещи: a) Внутри функции logic у нас есть printf, который печатает некоторый вывод на экран, и b) функция logicвозвращает значение типа int. Это то, что указывает первый int в int logic(int a, int b).

Теперь давайте посмотрим на оригинальный вызов:

d = logic(a, logic(c, f));

Это говорит машину, которую мы хотим получить значение, возвращаемое функцией logic и хранить в переменной в d. Однако для вызова logic нам нужны два параметра int. Первый из них задан как переменная a, но для определения значения для второго параметра сначала необходимо выполнить функцию, которая в этом случае будет logic.

Это то же самое, что и в обычной математике: для вычисления f(g(x)) вам нужно будет сначала рассчитать g(x) и использовать результат в качестве входных данных для f. В программе вы могли бы использовать другую переменную для хранения промежуточного результата, например int g_result = g(x); f(g_result); Это полностью эквивалентно.

Итак, для расчета результата logic(a, logic(c, f));, logic необходимо запустить дважды. Каждый раз, когда выполняется logic, он проходит через printf и производит некоторый вывод на экране.

И поэтому мы получаем две строки вывода «== ... ==», по одному для каждого запуска функции logic.

Как было сказано выше, вы могли бы просто написать то же самое:

int first_result = logic(c, f); // This call produces the output of "== 6 1 1==" and returns the value 8 (= 6 + 1 + 1) which gets assigned to "first_result" 

d = logic(a, first_result); // This call produces the output of "==11 7 2==" from the function parameters "a" (=10) and "first_result" (=8). 
+0

Спасибо за тонну. Первая часть, которую я видел, была очень полезной! – Impugnor