4.1. Fonksiyon Tanımlama
Aslında bir fonksiyonu, yani main
fonksiyonunu, nasıl tanımlayacağımızı zaten biliyoruz. Şimdi, bir
fonksiyonun daha genel bir şeklini görelim:
dönüş_tipiopt fonksiyon_ismi (parametre_bildirimleriopt) blok
Dönüş_tipi fonksiyon tarafından döndürülen değerin tipini
belirtir. Bu, int
, double
gibi bir aritmetik tip veya gösterge olabilir. Bir dizi (ve bazı eski
derleyicilerde bir yapı veya birlik) olamayabilir, ancak bunlara bir
gösterge olabilir. Bir fonksiyon için varsayılan dönüş tipi
int
’tir, bu da geniş bir alanı kapsar,
çünkü genelde mantıksal değerler (doğru/yanlış değerleri) ve karakterler
için de int
kullanırız. Ancak, her durumda
(yani int
bile olsa) dönüş tipinin
açıkça belirtilmesi önerilir.
Dönüş_tipi olarak void
anahtar sözcüğü
kullanıldığında, fonksiyondan hiçbir değer döndürülmeyeceği belirtilmiş olur.
void
fonksiyonlar FORTRAN’daki
SUBROUTINE
’ler veya Pascal’daki
procedure
’ların karşılığıdır.
Doğal olarak, bir void
fonksiyon çağrısı bir
ifade içinde yapılamaz.
Fonksiyon_ismi bir tanıtıcı sözcüktür. Eğer fonksiyon, ayrıca derlenen başka bir kaynak dosyadan çağrılacaksa, fonksiyon isminin belirli sayıdaki ilk karakteri sadece anlamlıdır, bu da bağlayıcı tarafından konulan sınırlamadan dolayıdır. Standarda göre bu sayı en az 31 karakter olmalıdır.
Parametre_bildirimleri virgülle ayrılmış ve önüne tipleri yazılmış
biçimsel argüman veya
parametre isimleri listesidir.
Diğer bir fonksiyon tarafından çağrıldığında bu fonksiyona geçirilecek olan
argümanların sayısını, sırasını ve tipini belirtir. Aynı zamanda,
parametrelere, sadece fonksiyonun gövdesini oluşturan blok’un
içinde anlamlı olan, isimler verir. Hiç parametresi olmayan bir fonksiyon da
olabilir. Bu durum, parantezler içine void
yazılarak
açıkça gösterilir. Örneğin,
int rand (void)
{
fonksiyonun gövdesi
}
Blok, her biri isteğe bağlı olan, iki kısımdan oluşan bileşik bir deyimdir: Bir değişken veya tip tanımlama veya bildirim kısmı ile onu izleyen deyimler. Kısım 1.8’e bakınız. Bildirim kısmı, fonksiyon gövdesi içinde yerel olarak kullanılacak olan nesnelerin tanımını veya bildirimini içerir. Deyimler, fonksiyon gövdesinin yürütülebilir kısmını oluştururlar. Not: C dilinin C99 ve daha sonraki standardına göre, tanım ve bildirimler ile deyimlerin ayrılmasına gerek yoktur ve blok içinde karışık olarak da kullanılabilirler. Ancak, bu kitapta böyle bir kullanımdan kaçınılmıştır.
Standarda göre, bir fonksiyon başka bir fonksiyon içinde tanımlanamaz. Diğer bir değişle, bir fonksiyon tanımı diğer bir fonksiyon tanımının bitmesinden sonra başlar. Fonksiyon tanımlamalarının sırası önemsizdir, ancak bu bölümde daha ileride bahsedeceğimiz dikkat edilmesi gereken bazı küçük noktalar vardır.
Şimdi, bir örnek. C’nin mutlak değer alma işleci
yoktur. Tamsayılar üzerinde çalışan bir fonksiyon tanımlayalım.
int abs (int n) { if (n >= 0) return n; else return -n; }
Burada, daha önce de ara ara karşımıza çıkan return
deyimini görmekteyiz. Bu genelde,
return;
veya
return ifade;
şeklinde olur. Kontrolün çağırana geri dönmesini sağlar.
return
deyiminden sonra gelen deyimler
işletilmez ve fonksiyon hemen çağrıldığı yere geri döner
.
İlk şekilde kontrol geri döner, ancak yararlı hiçbir
değer döndürülmez. Geri döndürülen değer tanımsız olduğu
için, çağıran fonksiyon bunu kullanmaya çalışmamalıdır. İkinci şekilde
ifadenin değeri fonksiyonun değeri olarak geri döndürülür. Eğer
ifadenin değerinin tipi fonksiyonun dönüş tipiyle aynı değilse,
otomatik tip dönüşümü yapılır. Dönüş_tipi
void
olan fonksiyonlar için ikinci şeklin
kullanılamayacağı açıktır.
Sağ çengelli parantezin önünde bir return
olduğu varsayılır; bundan dolayı belli bir değer döndürmek istemiyorsanız
return
yazmayabilirsiniz. Son deyim yerine
getirildikten sonra, yararlı bir değer olmadan kontrol çağıran fonksiyona
döndürülecektir. Bu yöntem dönüş_tipi void
olan fonksiyonlarda kullanılabilir.