Değişkenler

C'de değişkenler veri depolamaya yarar ve herbirinin bir kimliği -değişken, fonksiyon gibi kullanıcı tarafından tanımlanan elemanların isimlerine kimlik denir- vardır ve kimliklerin oluşturulmasında bir takım kurallar vardır:

- Kimliklerin ilk karakteri harf veya "_" olmalıdır.
- Diğer karakterler harf, rakam veya "_" olmalıdır.
- Kimlikler büyük harf ve küçük harfe duyarlıdır.

Değişkenlerin ilan edilme kalıbı şu şekildedir: tip isim(ler); ve bir satırda aynı tipten birden fazla değişken tanımlanacaksa isimler arasına virgül konur. Değişkenler ilan edildikleri tipteki verileri depolarlar.

Değişkenlerin ilan edilmesini örneklendirecek olursak:

int x;
double gelir, gider, kar;
unsigned char a;

Değişkenler ilan edildiklere yere göre global değişken, yerel değişken veya formal parametre olarak adlandırılırlar.


Global Değişkenler

Global değişkenler tüm fonksiyonların dışında ilan edilirler ve tüm fonksiyonların içinde bilinirler. Bu değişkenler devamlı surette  bellekte tutulacaklarından çok gerekli olmadıkça kullanılmamalıdır.


Yerel Değişkenler

Yerel değişkenler sadece içinde ilan edildikleri blokta bilinirler bu nedenle blok dışını etkilemezler. Örnek olarak aşağıdaki kod incelenebilir:

#include <stdio.h>

int main(void){
    int x=0;
    if(x==0){
        int x=10;
        printf("Inner x:%d\n",x);
    }
    printf("Outer x:%d",x);
    return 0;
}

Burada adımları inceleyelim. Kütüphane belirtilip ana fonksiyon başlatıldıktan sonra bir x değişkeni tanımlanmış ve değeri 0'a eşitlenmiştir. Daha sonra bir if döngüsü oluşturulmuştur. Bu döngüye göre x'in değeri kontrol edilecek ve belirtilen şartın sağlanması durumunda parantezler içindeki kod çalışacaktır. Burada belirtilen şart x'in 0'a eşit olması olduğu için içerideki kod parçası işleme alınacaktır. İçeride tekrardan bir x değişkeni ilan edilmiştir ve değeri 10'a eşitlenmiştir. Sonrasında x'in değeri yazdırılmıştır. x'in değeri 10 olduğu için sonuç "Inner x: 10" yazısı olmalıdır. Daha sonra parantez kapatılmakta ve x'in değerinin tekrar yazdırılması istenmektedir. Burada x'in değeri 0'dır çünkü if döngüsünün parantezleri arasında ilan edilen x değişkeni sadece o parantezler içinde bilinmektedir. Parantez dışına çıkıldığında o değişken silinir ve x değişkeni olarak en başta ilan edilen değişken bilinir. Bu nedenle sonuç "Outer x: 0" yazısı olmalıdır.

C89 standartlarına göre yerel değişkenler kullanılacakları bloğun en başında ilan edilmelidir. Fakat C99 standartlarına göre değişkenler kullanılmadan önce herhangi bir yerde ilan edilebilirler.


Formal Parametreler

Fonksiyon tanımlamalarında argüman olarak kullanılan değişkenlerdir.

Örneğin şöyle bir fonksiyon tanımlamış olalım:

int mult(int x, int y){
    return x*y;
}

Bu fonksiyon daha sonra misalen "mult( 3, 5)" diye çağrılırsa x = 3 ve y = 5 olacaktır ve sonuç 15 olarak bulunacaktır. Daha sonra x ve y değişkenleri bellekte tutulmayacak silineceklerdir.

Fonksiyon tanımlamalarında sadece argüman olarak tanımlanan değişkenler formal parametredir. Fonksiyon parantezlerinin içinde başka değişkenler tanımlanacak olursa onlar formal parametre değil yerel değişkendir.


ÖRNEK:

Şimdi global değişkenler ve yerel değişkenler arasındaki farkın iyi anlaşılabilmesi için bir örnek vereceğiz. Önce kodun tamamını verelim sonra kodu adım adım inceleyebiliriz.

#include <stdio.h>

int a=1;
void f1(void);
void f2(void);
void f3(void);

int main(void){
    f1();
    f2();
    return 0;
}

void f1(void){
    f3();
    printf("a1=%d\n",a);
}

void f2(void){
    printf("a21=%d\n",a);
    int a=2;
    f3();
    printf("a22=%d\n",a);
}

void f3(void){
    int a=50;
}

Her zamanki gibi ilk olarak kullanacağımız kütüphaneler eklenmiştir. Bu örnekte sadece stdio.h kütüphanesi kullanılmıştır. Sonra bir a değişkeni tanımlanmış ve bu değişkene ilk değer olarak 1 atanmıştır. Bütün fonksiyonlardan önce tanımlanmış olan bu değişken global değişkendir.

Sonra programda f1, f2 ve f3 olmak üzere üç fonksiyon kullanılacağı belirtilmiştir. Fonksiyonların çalışması için herhangi bir değer girilmesi gerekmediğini belirtmek amacıyla burada parantezler içine void yazılmıştır. Ayrıca fonksiyonların sonuçta herhangi bir değer oluşturmayacağını belirtmek için de başlarına void yazılmıştır.

Sonra ana fonksiyon tanımlanmıştır. Ana fonksiyon sırasıyla f1 ve f2 fonksiyonlarını çalıştırmaktadır.

Devamında f1, f2 ve f3 fonksiyonları tanımlanmıştır. f1 fonksiyonu önce f3 fonksiyonunu çalıştıracak ardından "a1=" yazısının karşısına a değerini yazdıracaktır. f2 fonksiyonu önce "a21=" yazısının karşısına a değerini yazdıracak, sonra yerel bir a değişkeni tanımlayıp buna ilk değer olarak 2'yi atayacak, ardından f3 fonksiyonunu çalıştıracak ve "a22=" yazısının karşısına a değerini yazdıracaktır. f3 fonksiyonu ise sadece bir yerel a değişkeni tanımlayacak ve bu değişkene 50 ilk değerini atayacaktır.

Şimdi kodun nasıl çalışacağını ve bize nasıl bir çıktı vereceğini inceleyelim. Ana fonksiyon ilk olarak f1 fonksiyonunu çalıştıracaktır. Şu anda a değeri olarak global değişken olan a'nın değeri yani 1 kullanılmaktadır. Daha sonra f1 fonksiyonu f3 fonksiyonunu çalıştıracaktır. Bu esnada yerel bir a değişkeni oluşturulacak ve a değişkeninin değeri 50 olacaktır. Fakat f3 fonksiyonunun çalışması bittiğinde yerel a değişkeni kaybolacak ve f1 fonksiyonu içinde 50 değeri kullanılmaya devam etmeyecektir. Çünkü f3 fonksiyonunun içindeki yerel değişken dışarısını etkilemeyecektir. Bu nedenle ekranımızda "a1=1" ifadesini göreceğiz.

f1 fonksiyonunun çalışması bittikten sonra ana fonksiyon f2 fonksiyonunu çalıştıracaktır. Şu anda a'nın değeri yine global değişkenin değeri olan 1'dir. Sonrasında f2 fonksiyonu a'nın değerini yazdıracaktır. Bu nedenle ekranımızda "a21=1" ifadesini göreceğiz. Ardından f2 fonksiyonu içinde a isimli bir yerel değişken tanımlanacaktır ve değeri "2" olacaktır. Ardından yine f3 fonksiyonu çalışacak fakat oradaki a değeri dışarıdaki yerel değişkeni etkilemeyecek ve ekranımızda "a22=2" ifadesini göreceğiz.

f2 fonksiyonunun çalışması bittikten sonra değeri "2" olan yerel değişken de kaybolacaktır. Bu örneğimizde yok ama eğer ana fonksiyon a değerini tekrar kullanmak isteseydi yine global değişken olan a'yı kullanacaktı.

Görüldüğü üzere yerel değişkenler sadece blokları içerisinde etkili olmaktadır.

Dipnot olarak şunu da belirtmek fayalı olacaktır. Eğer kullandığınız derleyici C99 standartlarına göre değil de C89 standartlarına göre derleme işlemi yapıyorsa f2 fonksiyonu sorun çıkaracaktır. Çünkü yerel değişken olan a blok başında ilan edilmemiştir.




Veri Tipleri <<<<< Temel C >>>>> Tip Niteleyiciler