Можно ли определить функцию после main ()? - PullRequest
0 голосов
/ 27 октября 2018

У меня есть код, который выглядит следующим образом и выполняется совершенно нормально,

#include <stdio.h>

int main( )
{
int i = 3, j = 4, k, l ;
k = addmult ( i, j ) ;
l = addmult ( i, j ) ;
printf ( "\n%d %d", k, l ) ;
}
int addmult ( int ii, int jj )
{
int kk, ll ;
kk = ii + jj ;
ll = ii * jj ;
return ( kk, ll ) ;
}

Мой вопрос заключается в том, можем ли мы впоследствии определить функцию, не определяя прототип функции вверху, и как функция может возвращать два значения

1 Ответ

0 голосов
/ 27 октября 2018

можем ли мы определить функцию впоследствии без определения прототипа функции вверху

Вы можете объявить ее прото в main.В вашем случае функция принимает int s и возвращает int, поэтому прототип по умолчанию (они все еще живы в стандарте?) Работал нормально.

как функция может вернуть двазначения?

  1. Может возвращать структуру по значению:

    typedef struct { int first; int second; } int_pair;
    int_pair addmult(int x, int y) {
        return (int_pair){42, 314}; /* enough for the demo, lol (c) */
    }
    

    Или по указателю:

    int_pair *addmult(int x, int y) {
        int_pair *retVal = malloc(sizeof(int_pair));
        return retVal->first = 42, retVal->second = 314, retVal;
    }
    int_pair *multadd(int x, int y) {
        static int_pair retVal{314, 42};
        return &retVal;
    }
    
  2. Может возвращать новый массив в куче:

    /* 1. It is user's responsibility to free the returned pointer. */
    int *addmult(int x, int y) {
        int *retVal = malloc(2 * sizeof(int));
        return retVal[0] = 42, retVal[1] = 314, retVal;
    }
    
  3. Наконец, он может возвращать массив без размещения последнего в куче:

    /* 1. It is user's responsibility to NEVER free the returned pointer. */
    int *addmult(int x, int y) {
        static int retVal[] = {42, 314};
        return retVal;
    }
    

    В этом случае возвращаемый массив может быть повторно использован (переписан) последующими вызовами, поэтому вы должны использовать его содержимое как можно скорее.

...