Возвращение значения функцией
Создадим функцию, определяющую max числа из двух. На входе в эту функцию будут передаваться два числа, а на выходе возвращаться одно, то которое больше. Для возврата используется ключевое слово return. В объявлении функции указывается тип возвращаемого значения.
void main (void){
int a=5, b=10, c=15, d=-10;
int e,f;
e=max(a, b);
f=max(c, d);
}
int max (int i, int j) {
int y;
y=i>j ? i:j;
return(y);
}
Оператор return прекращает работу функции и передает управление следующему оператору в вызывающей функции, даже если он не является последним оператором в функции. Количество операторов return не ограничено. Возвращаемое значение присваивается переменной по выходу из функции.
С++
Inline-функции
Перед определением функции может быть использован спецификатор inline для того, чтобы компилятор помещал код функции непосредственно в место вызова функции. Такими функциями могут быть небольшие функции линейного алгоритма.
Пример:
//расчет площади круга
inline float Circle(float)
void main ( ) {
float S; float R=10.5;
S= CircleR;
printf ………
} // далее тело функции:
float Circle(float r){
return 3.14*r*r;
}
Пример:
#include <stdio.h>
#include <conio.h>
#include <dos.h>
void notinline(void) { };
inline void isinline(void) { };
void PrintTime(void);
void main(void)
{
long index;
printf("Starting notinline\n");
PrintTime();
for( index=1; index<=5000000; index++)
notinline();
PrintTime();
printf("Starting isinline\n");
for( index=1; index<=5000000; index++)
isinline();
PrintTime();
}
void PrintTime(void)
{
struct time t;
gettime(&t);
printf("Сейчас: %2d:%02d:%02d.%02d\n",
t.ti_hour, t.ti_min, t.ti_sec, t.ti_hund);
}
Это увеличивает код программы, но ведет к увеличению быстродействия работы программы. Inline-функции не должны содержать сложные программные конструкции.
Функция PrintTime() печатает на экране системное время, используя структуру,
описанную в заголовочном файле dos.h.
Значение формальных параметров функции по умолчанию
Формальный параметр может иметь значение по умолчанию. Все параметры, стоящие справа от него тоже должны иметь значения по умолчанию. Эти значения передаются в функцию, если при вызове данные параметры не указаны.
#include <stdio.h>
void noName1 (float x, int y, char z='b') {
printf("x = %0.1f , y = %d, z = %d \n", x,y, (int)z);
}
void noName2 (float x, int y=16, char z='a') {
printf("x = %0.1f y = %d, z = %d \n", x,y, (int)z);
}
void noName3 (float x=1.3, int y=4, char z='c') {
printf("x = %0.1f y = %d, z = %d \n", x,y, (int)z);
}
void main(void) {
noName1(1.0,2);
noName2(100.0);
noName3();
}
Правило: после присвоения формальному параметру значения по умолчанию, все ФП, находящиеся правее него тоже должны иметь значение по умолчанию.
Перегрузка функций
В Си++ можно перегрузить функцию, определив её несколько раз, но с разными параметрами.
Имена функций могут быть перегружены в пределах одной области видимости. Компилятор отличает одну функцию от другой по сигнатуре. Сигнатура функции задается числом параметров, порядком их следования и типами параметров.
Например, рисование: линия, круг, прямоугольник, …
#include <stdio.h>
#include <string.h>
int noName (int first) {
return first*first;
}
int noName (unsigned first) {
return first*first;
}
char noName (char first) {
return first*first;
}
int noName (int first,char *second) {
return first*strlen(second);
}
float noName (float r) {
return r*r;
}
double noName (double r) {
return r*r;
}
void main(void) {
printf("%d\n", noName(4));
printf("%d\n", noName((unsigned)4));
printf("%c\n", noName('c'));
printf("%d\n", noName(4,"cлово"));
printf("%0.2f\n", noName((float)1.2));
printf("%0.2lf\n", noName((double)1.2));
}
Рекурсия
Действие, состоящее в том, что функция вызывает сама себя, называется рекурсией. Когда функция вызывает сама себя, не происходит передачи управления на её начало. Вместо этого на памяти машины создаются копии всего набора переменных функции. Адреса этих переменных не изменяются от итерации к итерации. Если же рассматривать цикл, о в нем адрес используемой переменой меняется, поскольку при каждом выполнении тела цикла создается новая копия переменной, каждая из которых будет носить одно и тоже имя, но иметь свой собственный адрес.
Дата добавления: 2016-02-02; просмотров: 1212;