Standart C Programlama Dili


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.