Udostępnij za pośrednictwem


Wywołania funkcji

Wywołanie funkcji jest wyrażeniem, które przekazuje kontrolę i argumenty (jeśli istnieją) do funkcji i ma postać:   

expression (expression-listopt)

gdzie expression to nazwa funkcji lub daje w wyniku adres funkcji a expression-list to lista wyrażeń (rozdzielanych przecinkami).Wartości tych końcowych wyrażeń są argumentami przekazywanymi do funkcji.Jeśli funkcja nie zwraca wartości, należy zadeklarować ją jako funkcję, która zwraca void.

Jeśli deklaracja istnieje przed wywołaniem funkcji, ale nie podano żadnych informacji dotyczących parametrów, wszelkie niezadeklarowane argumenty poddawane są po prostu zwykłej konwersji arytmetycznej.

[!UWAGA]

Wyrażenia na liście argumentów funkcji mogą być badane w dowolnej kolejności, więc argumenty, których wartości mogą zostać zmienione przez skutki uboczne z innego argumentu będą miały niezdefiniowane wartości.Punkt sekwencji zdefiniowany przez operatora wywołania funkcji gwarantuje tylko że wszystkie skutki uboczne na liście argumentów są badane przed przekazaniem kontroli do wywoływanej funkcji. (Należy zauważyć, że kolejność, w której argumenty są wrzucane na stos to oddzielna kwestia). Zobacz Punkt sekwencji aby uzyskać więcej informacji.

Jedyne wymaganie w każdym wywołaniu funkcji jest takie, aby wyrażenie przed nawiasami dawało w wyniku adres funkcji.Oznacza to, że funkcja może zostać wywołana przez każde wyrażenie wskaźnika funkcji.

Przykład

Ten przykład ilustruje wywołanie funkcji z instrukcji switch:

int main()
{
    /* Function prototypes */

    long lift( int ), step( int ), drop( int );
    void work( int number, long (*function)(int i) );

    int select, count;
    .
    .
    .
    select = 1;
    switch( select ) 
    {
        case 1: work( count, lift );
                break;

        case 2: work( count, step );
                break;

        case 3: work( count, drop );
                /* Fall through to next case */
        default:
                break;
    }
}

/* Function definition */

void work( int number, long (*function)(int i) )
{
    int i;
    long j;

    for ( i = j = 0; i < number; i++ )
            j += ( *function )( i );
}

W tym przykładzie wywołanie funkcji w main,

work( count, lift );

przekazuje zmienną całkowitą count, i adres funkcji lift do funkcji work.Należy zauważyć, że adres funkcji jest przekazywany po prostu przez podanie identyfikatora funkcji, ponieważ identyfikator funkcji daje w wyniku wyrażenie wskaźnika.Aby użyć identyfikatora funkcji w ten sposób, funkcja musi być zadeklarowana lub zdefiniowana przed użyciem identyfikatora; w przeciwnym razie identyfikator nie zostanie rozpoznany.W tym przypadku prototyp work znajduje się na początku funkcji main.

Parametr function w work został zadeklarowany jako wskaźnik do funkcji przyjmującej jeden argument int i zwracającej wartość long.Nawiasy wokół nazw parametrów są wymagane; bez nich, deklaracja określałaby funkcję zwracającą wskaźnik do wartości long.

Funkcja work wywołuje wybraną funkcję wewnątrz pętli for przy użyciu następującego wywołania funkcji:

( *function )( i );

Jeden argument, i, jest przekazywany do wywoływanej funkcji.

Zobacz też

Koncepcje

Funkcje (C)