OriginalGriff
Когда вы определяете функцию, вы создаете подпись для него: параметры, которые ему нужно задать для работы, и тип значения, которое он возвращает в ваш код.
В вашем первом фрагменте кода, test_function
объявляется как имеющая сигнатуру принятия одного целочисленного параметра и возвращающая целочисленное значение.
Поэтому, когда вы вызываете его, вы правильно предоставляете один параметр и используете результат:
z = test_function(x);
Вы передаете значение x (не саму переменную-C всегда передает значения, а не ссылки, но не беспокойтесь об этом ни на минуту) и возвращаете его, умноженное на себя и два.
Таким образом, вы можете поставить значение десять, и оно вернет 200.
Ваша вторая версия переопределяет
test_function
с другой сигнатурой: теперь он ожидает, что ему будут переданы два целых числа, и все равно возвращает одно целое значение.
Но когда вы пытаетесь вызвать функцию:
z = test_function(x);
Вы вводите только один параметр, поэтому система не знает, что делать, и выдает ошибку.
Если вы хотите использовать эту подпись, вам нужно передать два параметра:
z = test_function(x, y);
Но даже тогда ваш код, как показано на рисунке, не будет работать:
int test_function(int x, int y)
{
int y = x;
x = 2 * y;
return (x * y);
}
Потому что определение нового
y
внутри тела функции "скрывается" версия, которую вы сказали ей ожидать в качестве параметра, и она на самом деле не уверена, какую именно вы хотели использовать.
Попробовать это:
int test_function(int x, int y)
{
int y2 = x;
x = 2 * y;
return (x * y2);
}
И
z = test_function(x, y);
и он должен правильно компилироваться.
Обратите внимание, что имена переменных в одной функции не имеют никакого отношения к переменным в другой: вы можете написать свою функцию так:
int test_function(int a, int b)
{
int c = a;
a = 2 * b;
return (a * c);
}
И это работает точно так же, потому что имена "x" и "y" не передаются при вызове функции, а только содержащиеся в них значения. Переменные не могут быть доступны непосредственно вне функции, в которой они объявлены, если только они не используются для передачи значения другой функции или не возвращаются вызывающему.