Archive for C

C ile Programlamaya Giriş – İlk Program

Temel bir C programının genel görünümü:

#include < stdio.h >

int main(){

    printf("Merhaba dünya!");
    /* ekrana merhaba dünya yazısı bastırır */
    return 0;
}

Şimdi tek tek bu satırları inceleyelim:

#include < stdio.h >

#include komutu ile yazacağımız programın hangi başlıklara(kütüphanelere) ihtiyacı olduğunu ve bunları dahil etmesi gerektiğini derleyiciye söyleriz. < ve > sembolleri arasına bu dosyanın adını yazarız. C’nin standart giriş ve çıkış fonksiyonları bu başlık dosyası(stdio.h) içindedir.

int main()

main dediğimiz şey aslında bir fonksiyondur ve programımız ilk olarak main isimli bir fonksiyon arayıp onu çalıştırır. Önündeki int ise bu fonksiyonun ne tür bir veri tipi döndüğünü belirtir. Veri tiplerini ve fonksiyonları sonraki yazılarımda açıklamaya çalışacağım. { ve } sembolleri arasında kalan satırların(kodların) bu fonksiyona ait olduğunu belirtir.

printf("Merhaba dünya!\n");

printf ekrana bir çıktı basmamızı sağlayan fonksiyondur. İçerisine tırnak işaretleri içerisinde bir yazı göndermemiz yeterli. “\n” ise alt satıra geç anlamına gelen bir karakterdir. “;” derleyiciye satırın sonuna geldiğimizi söyleyen semboldür ve zorunludur. Her satırın sonuna “;” koymamız gerek yoksa syntax error (sözdizimi hatası) alırız.

/* ekrana merhaba dünya yazısı bastırır */

/* */ sembolleri bu satırların derleyici tarafından okunmaması gerektiğini belirtir. Peki o halde bu satıra ne ihtiyacımız var. Bu semboller kodumuza açıklama(yorum) eklemek içindir. Başka bir deyişle kodumuzu başkası okurken veya daha sonra biz kodumuzu incelerken hangi kodu ne için yazdığımızı hatırlamamız için koyduğumuz açıklamaları derleyicinin gözardı etmesi için bu sembolleri kullanırız. Bu iki sembol arasındaki yazıları derleyici okumaz. Eğer açıklamamız tek satır ise // sembolünü de kullanabiliriz.

/*
Bu
çok
satırlı
bir 
açıklama
*/
// Bu ise tek satırlı bir açıklama
return 0;

main’in int veri türünde yani tam sayı tipinde bir değer dönen fonksiyon olduğunu söylemiştim. Bu kod fonksiyonun sona geldiğini, ve işlemlerini bitirdiği anlamına geliyor.

İşte bu kadar ilk C programımızı yazdık 😉

Makro Tanımlarken Parantezlerin Önemi

C programlamada “#define” makrosu tanımlarken dikkat edilmesi gereken bazı noktalar var. Bunlardan birisi de parantezler; çünkü insanların hayalindeki gibi çalışmaz her zaman bu “#define” makroları. Diğer programcıların tanımladıkları makrolarda ne kadar gereksiz parantez kullanmış diyorsanız bu yazımı okuduktan sonra bir kez daha düşünün. Makrolar ne görürse aynen yapmasını söylediğiniz şeyi yapar sorgulayamaz, hesap yapamaz. Fazla uzatmadan bir kaç örnek vereyim:

#include 
#define ABS(x) x>0?x:-x

int main()
{
    printf("%d\n",ABS(3-5));
    return 0;
}

Bu kod parçasında ABS ismiyle tanımladığımız makrodan, gönderdiğimiz değer eğer 0’dan küçükse başına eksi koyarak 0’dan büyükse kendisi olarak döndürmesini bekliyoruz. Kısaca mutlak değer.  Beklediğimiz değer 3-5 = -2 olduğu için +2 dönmesi. Fakat makroya giden değer -2 değil 3-5. Bunda ne fark var diyeceksiniz, fark şudur ki makrolar fonksiyonlar gibi değeri hesaplayıp o değerle işlem yapmazlar. Makrolar birer sözlük gibi çalışırlar. Derleme anında gerekli değişiklikleri yapıp işlerini sonlandırırlar. Tıpkı en basit notepad programlarında bul ve değiştir (ctrl+h) modülünün çalışma mantığındadırlar. Bunu öğrendikten sonra tekrar incelersek yazdığımız abs makrosu 3-5 in sıfırdan küçük olduğunu gördü ve başına – işareti koydu. Yani -3-5 oldu ve bu da bize -8 sonucunu verdi. Aslında o kadar da şaşıracak bir şey yokmuş değil mi? :) Peki çözümü nedir?

#define ABS(x) (x)>0?(x):-(x)

Eğer makromuzu böyle tanımlasaydık hiç bir problem yaşamayacaktık. Bir diğer örneğimiz ise;

#include 
#define SQR(x) (x*x)
int main()
{
    printf("%d\n",SQR(2+3));      
    return 0;
}

Aynı açıklamaları uzun uzun tekrar yapmayacağım. Bizim beklediğimiz 2+3=5. O halde 5*5=25 olmalı. Oysa ki makromuz 2+3 değerini 2+3*2+3 haline sokuyor. Bu da matematiksel olarak 2+(3*2)+3 e eşittir. Yani 11’e.

#define SQR(x) ((x)*(x))

Eğer makromuzu böyle tanımlamış olsaydık hiç bir problemle karşılaşmayacaktık. :)