27.06.2012

C Hakkında Bilmediklerim

Merhaba Arkadaşlar;

Uzun zamandır burada yazmıyordum. Yazmak istediklerim vardı elbet ama ya fırsat olmadı ya da tamda istediğim gibi yazabileceğime inanmadım. Burada şunu fark ettim. Teknik anlamda anlatılabilecek bir mevzuyu gerçekten olmasını istediğim gibi detaylandırmak ve o şekilde yazmak çok zahmetli bir işmiş. Başarabilen arkadaşlara artık bir nebze daha saygıyla bakıyorum. Neyse bugünün konusu bu değil aslında. Bugün ne kadar öğrenirsek öğrenelim hiç bitmeyen bir öğrenmenin sürecinden bahsetmek istiyorum.

Şuan Belbim A.Ş. de çalışmaktayım ve önümüzdeki pazartesiden itibaren ROM elektronikte çalışmaya başlayacağım. Burada kaldığım bu son günlerde C++ eğitimi başladı. C programcıları derneğinin de kurucusu olan Kaan hoca tarafından veriliyor ders. Bende merak ettiğimden derse girdim. Hocamız taaaa 1984 te ben doğmadan da önce C programlamaya başlamış ki o tarihte daha C nin standardı yok. Bilgisayarlarda HDD pahalı olduğu için kullanılmıyor onu yerine 5.25" lik disketler kullanılıyormuş.

Ben derse girdiğimde C ve C++ ı karşılaştırarak C de olmayıp ama C++ olan ya da tersi durumları anlata anlata gidiyor. Hani bende kendimi bir şey sanıyorum. C biliyorum diye geçiniyorum ortalıkta. Meğerse doğru bildiğim şeylerle ilgili bir çok şeyi yanlış biliyormuşum.






Mesela sıkça kullandığımız "//" yorum işaretçisi. C standartlarında böyle bir şey yok. Yani kodunuzun içinde bu şekilde yorum yazdıysanız C standartlarını ihlal etmişsiniz demektir. bunun yerine çoklu satırlarda kullanılan şekli ile yani "/* yorumlar buraya */" şeklinde yazmanız gerekiyor.

Bilindiği üzere header file ile projemize kütüphanelerdeki prototipleri ekliyoruz. Bu şekilde derleme esnasında dahil edilen standart kütüphanelerdeki fonksiyonların prototiplerini kodumuza bildiriyoruz. Peki biz kodumuzu derlemeden önce "stdio.h" header dosyasını eklemeyi unuttuk. Bununla beraber gittik kodumuzun içerisine "printf("Merhaba Dunya");"yazdık. Sizce ne olacak? Hepinizin "program derlenmez.", "Derleyici Prototip yok"der dediğinizi duyar gibiyim. Maalesef bu yaklaşım yanlış. Ama neden yanlış derseniz gerekçesi çok ilginç. Öncelikle tarihin çok ama çok öncelerine gidelim. Dennis Ritchie C yi ilk yazarken prototip olayını kafasında biraz farklı kurmuş ve demişki prototip şu şekilde tanımlanır:

Geri_Dönüş_Değeri Fonksiyon_Adı();

Burada fark ettiğiniz gibi fonksiyonun aldığı parametrelerin önemli olmadığını düşünmüş. Sonradan bu yaklaşımın çok iyi olmadığı anlaşılmış ama geriye uyumluluktan dolayı bu şeklide geçerli kalmış. Yani siz bir fonksiyonu yukarıdaki gibi tanımlayabilirsiniz. Tabi bunun böyle olması hali hazırda bizi kurtarmıyor çünkü hala ortada bir sıkıntı var biz bunu da yazmadık. Doğru biz bunu yazmadığımız halde program hata vermez çünkü burada bir diğer C kuralı devreye girer. Bu kural kabaca "default type" yani varsayılan tip değerinin "int" olduğunu söyler. Bu şu demektir; eğer siz bir tip değeri girmezseniz derleyici onu otomatik olarak int kabul eder tabi burada önemli olan tip değerini eksik bıraktığınızı derleyicinin anlaması lazım. Örnek vermek gerekirse;

int main()
{
    a = 5; // bu hatalı kullanım olur
}

int main()
{
  const  a = 5; // burada a nın türü int olur
}

ya da

main()//geri dönüş değeri int olur.
{
  static  a = 5; // burada a nın türü int olur
}

Bu kural gereği derleme esnasında program tanımadığı bir fonksiyon çağrımı ile karşı karşıya kaldığı vakit bunun geri dönüş değeri int olan bir fonksiyon olduğunu düşünür. Eğer gerçekten de geri dönüş değeri int olan bir fonksiyon çağırmışsanız (printf in geri dönüş değeri int dir) derlemeden geçersiniz.

Buradan varmak istediğim nokta ne kadar bilirsen bil kardeş hepsini biliyorum deme. Gün geçmiyor ki yeni bir şey daha öğrenmeyesin.

Görüşmek üzere;

1 yorum: