Тип возвращаемых данных

Возвращаемый тип функции устанавливает размер и тип значения, возвращаемого функцией. Он соответствует разделу type-specifier синтаксиса:

Синтаксис

function-definition:
  declaration-specifiers необ.attribute-seqнеоб.declaratordeclaration-listнеоб.compound-statement

/* attribute-seq используется только в системах Майкрософт */

declaration-specifiers:
  storage-class-specifier declaration-specifiers необ.
  type-specifier declaration-specifiers необ.
  type-qualifier declaration-specifiers необ.

type-specifier:
 void
 char
 short
 int
  __int8 /* Только для систем Майкрософт */
  __int16 /* Только для систем Майкрософт */
  __int32 /* Только для систем Майкрософт */
  __int64 /* Только для систем Майкрософт */
 long
 long long
 float
 double
 long double
 signed
 unsigned
 struct-or-union-specifier
 enum-specifier
 typedef-name

Можно type-specifier указать любой фундаментальный, структуру или тип объединения.

Тип возвращаемого значения, указанный в определении функции, должен соответствовать возвращаемому типу в объявлениях функций в любом другом месте программы. Функция возвращает значение при выполнении оператора return, содержащего выражение. Выражение вычисляется, преобразуется в тип возвращаемого значения (при необходимости) и осуществляется возврат в точку, где была вызвана функция. Если функция объявлена с типом возвращаемого значения void, оператор return, содержащий выражение, создает предупреждение, и выражение не вычисляется.

В приведенных ниже примерах показываются возвращаемые значения функции.

typedef struct
{
    char name[20];
    int id;
    long class;
} STUDENT;

/* Return type is STUDENT: */

STUDENT sortstu( STUDENT a, STUDENT b )
{
    return ( (a.id < b.id) ? a : b );
}

В этом примере определяются тип STUDENT с помощью объявления typedef, а также функция sortstu, чтобы иметь возвращаемый тип STUDENT. Функция выбирает и возвращает один из двух своих аргументов структуры. В последующих вызовах этой функции компилятор проверяет, что аргументы имеют тип STUDENT.

Примечание.

Эффективность можно увеличить путем передачи указателей на конкретную структуру, а не на всю структуру.

char *smallstr( char s1[], char s2[] )
{
    int i;

    i = 0;
    while ( s1[i] != '\0' && s2[i] != '\0' )
        i++;
    if ( s1[i] == '\0' )
        return ( s1 );
    else
        return ( s2 );
}

В этом примере определяется функция, возвращающая указатель на массив символов. Функция принимает в качестве аргументов две строки (два массива) символов и возвращает указатель на более короткую из них. Указатель на массив указывает на первый из элементов массива и имеет его тип; таким образом, возвращаемый тип функции — указатель на тип char.

Объявлять функции с возвращаемым типом int перед их вызовом не требуется, хотя рекомендуется использовать прототипы, чтобы для аргументов и возвращаемых значений включалась правильная проверка типа.

См. также

Определения функций в C