Päivitetty viimeksi 27. heinäkuuta 2020
Todelliset argumentit #
Argumentteja, jotka mainitaan funktiokutsussa, kutsutaan todellisiksi argumenteiksi. Esimerkiksi:
func1(12, 23);
tässä 12
ja 23
ovat todellisia argumentteja.
Todelliset argumentit voivat olla vakioita, muuttujia, lausekkeita jne.
12 |
func1(a, b); // here actual arguments are variablefunc1(a + b, b + a); // here actual arguments are expression |
Formaaliargumentit #
Argumentteja, jotka mainitaan funktion määritelmässä, kutsutaan formaaliargumenteiksi. Formaalit argumentit ovat hyvin samanlaisia kuin funktion sisällä olevat paikalliset muuttujat. Aivan kuten paikalliset muuttujat, muodolliset argumentit tuhoutuvat, kun funktio päättyy.
1234 |
int factorial(int n){ // write logic here} |
Tässä n
on muodollinen argumentti. Muistettavaa todellisista ja muodollisista argumenteista.
- Funktiokutsun todellisten argumenttien järjestyksen, lukumäärän ja tyypin on täsmättävä funktion muodollisten argumenttien kanssa.
- Jos todellisten ja muodollisten argumenttien välillä on tyyppivirhe, kääntäjä yrittää muuntaa todellisten argumenttien tyypin muodollisiksi argumenteiksi, jos se on laillista, Muussa tapauksessa muodolliseen argumenttiin siirretään roska-arvo.
- Formaalissa argumentissa tehdyt muutokset eivät vaikuta todellisiin argumentteihin.
Seuraava ohjelma havainnollistaa tätä käyttäytymistä.
1 2 3 4 5 6 7 8 910111213141516171819202122232425 |
#include<stdio.h>void func_1(int);int main(){ int x = 10; printf("Before function call\n"); printf("x = %d\n", x); func_1(x); printf("After function call\n"); printf("x = %d\n", x); // signal to operating system program ran fine return 0;}void func_1(int a){ a += 1; a++; printf("\na = %d\n\n", a);} |
Tässä muuttujan x
arvo on 10
ennen kuin funktiota func_1()
kutsutaan, func_1()
kutsun kutsumisen jälkeen muuttujan x
arvo muuttujan main()
sisäpuolella main()
on edelleen 10
. Funktiossa func_1()
tehdyt muutokset eivät vaikuta x
:n arvoon. Näin tapahtuu, koska kun välitämme arvoja funktioihin, arvosta tehdään kopio ja tämä kopio välitetään muodollisiin argumentteihin. Formaalit argumentit toimivat siis alkuperäisen arvon kopiolla, eivät itse alkuperäisellä arvolla, minkä vuoksi func_1()
:n sisällä tehdyt muutokset eivät heijastu main()
:n sisällä. Tämä prosessi tunnetaan argumenttien välittämisenä käyttäen Call by Value -menetelmää, käsittelemme tätä käsitettä yksityiskohtaisemmin tulevissa luvuissa.