Имеется два способа окончания работы функции и передачи управления вызывающему коду. Первый способ предполагает достижение последнего оператора функции, после чего работа функции заканчивается при встрече }. (Конечно, фигурной скобки на самом деле нет в объектном коде, но никто не мешает нам так думать.) Например, следующая функция выводит на экран строку:
void pr_reverse(char *s)
{
register int t;
for(t=strlen(s) -1; t > -1; t-) printf ("%c", s [t]);
}
После отображения строки функция ничего не делает, поэтому управление передается вызвавшему ее коду.
Тем не менее, не многие функции используют данный метод окончания своего выполнения. Большинство функций используют оператор return для окончания выполнения с целью возврата значения или упрощения кода функции и увеличения его эффективности путем создания нескольких точек выхода. Важно запомнить, что функция может иметь несколько операторов return. Например, функция, показанная ниже, возвращает или индекс первого появления подстроки, указываемой в s1, в строке, указываемой в s2, или —1, если не обнаружено совпадений:
int find_substr (char *s1, char *s2)
{
register int t;
char *p, *p2;
for(t=0; s1[t]; t++)
{
p = &s1[t];
p2 = s2;
while (*p2 && *p2==*p)
{
p++;
p2++;
}
if(!*p2) return t;
}
return -1;
}
Надо обратить внимание, как два оператора return упрощают функцию.