Atama İşlemleri

C'de atama işlemi genel olarak şu şekilde yapılır:

değişken = ifade;

Sağdaki ifadenin değeri soldaki değişkene atanır. Bunu zaten daha önceki örneklerde de yapmıştık. Konuyla alakalı bir nüansı da gösteren küçük bir örnek yapalım:

#include <stdio.h>

int main(void){
    int a=0;
    printf("%d\n",a);
    int b=5;
    a=b;
    printf("%d\n",a);
    b=10;
    printf("%d",a);
    return 0;
}

Burada ilk olarak a değişkeni tanımlanmış ve bu değişkene 0 değeri atanmıştır. Daha sonra a'nın değeri yazdırılmıştır. Bu ifade "0" olmalıdır. Daha sonra b değişkeni tanımlanmıştır ve b'nin değeri a'ya atanmıştır. Dikkat edilmesi gereken nokta a değişkenine atanan değerin b değişkeni değil b'nin değeri olduğudur. Bunu bir sonraki adımda daha iyi anlayacağız. Şimdilik a'nın değeri tekrar yazdırıldığında "5" değeri ile karşılaşacağımızı biliyoruz. Sonra b'ye 10 değeri atanmış ve a değişkeninin değeri tekrar yazdırılmıştır. Karşımıza çıkacak değer "10" değil yine "5" olacaktır. Çünkü bir önceki adımda a'ya b değişkeninin o anki değeri atanmıştır. b'nin değerinin daha sonra değiştirilmesi a'nın değerini etkilemeyecektir.


Atamada Tip Dönüşümü

Atama yapılırken soldaki ve sağdaki ifadelerin tipleri birbirinden farklı ise sağdaki ifadenin değeri soldaki değişkenin tipine dönüştürülür.

Tam sayı değişkenlerinde dönüşüm yapılırken dönüştürülecek olan tip dönüşecek olan tipin sınırları içerisinde kalıyorsa bir kayıp yaşanmaz. Aksi durumda kayıplar olabilir.

Bir örnek yapacak olursak:

#include <stdio.h>

int main(void){
    short int a=400;
    unsigned char b=a;
    signed char c=a;
    printf("%d\n",b);
    printf("%d",c);
    return 0;
}

Örnekteki kodun çıktısı şudur:

144
-112

a bir short int olarak tanımlanmıştır ve değeri olarak 400 atanmıştır. Bu değer 16 bitte şöyle depolanacaktır:

00000001 10010000

Daha sonra unsigned char olan b'ye ve signed char olan c'ye bu değer atanmıştır. Fakat bu iki veri tipi de 8 bitte depolama yapmaktadır. Bu nedenle baştaki 8 bit kaybolacaktır ve bu iki değişkenin değeri de 10010000 olarak depolanacaktır. İkili sistemdeki bu sayının değeri de unsigned char için 144 signed char için -112'dir. Görüldüğü gibi sağdaki değer soldaki veri tipinin sınırlarını aştığı için kayıp yaşanmıştır.

Aynı örneği a'yı en başta 200'e eşitleyerek yapalım. Bu durumda çıktının şu olduğu görülecektir:

200
-56

Bu sefer a 00000000 11001000 olarak depolanmıştır. Baştaki sekiz bitin değeri olmadığı için bu bir veri kaybı yaşatmayacaktır. Bu nedenle unsigned char olan b doğru çıktıyı verecektir. Veri kaybı yaşanmamış da olsa tip dönüşümü signed char için hataya yol açacaktır. Çünkü 200 sayısı signed char'ın sınırları dışındadır. Baştaki 1 signed char için \(2^7\) değil \(-2^7\) değerini ifade etmektedir.

Eğer a'ya değer olarak 100 atanarak örnek kod çalıştırılsaydı veri kaybı veya hata olmayacaktı.

Küsuratlı sayılar tam sayıya dönüştürüldüğünde küsuratlı kısım kaybolur. Ayrıca küsuratlı sayı tipi tam sayı tipinin sınırlarını aşarsa yine kayıplar olacaktır. Bunun tersi bir dönüşümde kayıp yaşanmaz.

Küsuratlı sayılar kendi aralarında dönüştürülürken dönüşüm düşük hassasiyetliden yüksek hassasiyetliye doğru olursa kayıp yaşanmaz. Aksi durumda kayıp yaşanabilir.


Çoklu Atama;

Bir seferde birden fazla değişkene aynı değer atanabilir. Öneğin şu şekilde bir tanımlama yapalım:

x = y = z = 0;

Bu durumda üç değişkene de 0 değeri atanacaktır.


Bileşik Atama

Artım ve azaltım işlemli atamalar için kısa bir atama şekli vardır. Örneğin x'in değerini 2 arttırmak için normalde şunu yazarız:

x = x+2;

Bunun yerine kısaca şu atama şekli de kullanılabilir:

x += 2;

Aynı şey azaltma işlemi için de geçerlidir. Aşağıdaki iki ifade birbirinin aynısıdır:

x = x-2;
x -= 2;




Sabitler <<<<< Temel C >>>>> Aritmetik İşlemler