Basit Bir C Programı ve Temel Kavramlar

C programlama dili ile ilgili genel bilgileri edindik. Şimdi artık C dilinin bazı özelliklerine değinme zamanı… Bunu yaparken de elbette bir örnek üzerinden gideceğiz. C programlama dili ile bir program yazarken kafamızda sanki İngilizce dilinde yazı yazıyormuşuz gibi bir düşünce oluşur. Makine dili ve assembly dillerinden farklı olarak yüksek seviyeli programlama dilleri kullanıcıya daha yakın bir yapıya sahiptir. C programlama dili de yüksek seviyeli bir dil olduğu için (bazı kaynaklarda orta seviyeli olarak geçer) bu algı oluşur.

Şimdi çoğu programlama diline başlarken yazdığımız "Merhaba, Dünya!" örneğimizle işe başlayalım. Ekrana "Merhaba, Dünya!" yazan bu programın tarihi 1978 yılında yayımlanan Brian Kernighan’ın "C Programming Language" kitabına dayandığı düşünülmektedir.[1] Öncelikle kodumuza bakalım:

// Code 1.3.1: Code1_3_1.c
// İlk C programı
#include <stdio.h>

// main fonksiyonu programı başlatır
int main(void)
{
    printf("Hello World!\n");
} // main fonksiyonunun sonu

Yorumlar

İlk iki satırda "//" ile başlayan kısımlara yorum (comment) adı verilir. Bu kısımlar derleme sırasında derleyiciler tarafından dikkate alınmazlar ve kodun okunabilirliği açısından önemlidirler. Bu kısa örnekte bu kadar önemli olmasa bile, büyük kod parçalarında hangi satırın ne belirttiğini yazmak ileride kodu okurken size veya kodu okuyan başka bir kişiye fayda sağlar. Bu nedenle yorumlar önemlidir. "//" karakterinden sonra bunu istediğiniz kadar tekrarlayabilirsiniz:

// Geçerli yorum
/// Bu da geçerli yorum
////// Bu da geçerli yorum

Zorunlu olmasa da yorum karakterlerinden sonra bir satır boşluk bırakmak okunabilirliği arttırır. Bunun yanında "//" ile yapılan yorumlar tek satırdan meydana gelebilir. Hemen altındaki satıra taşan yorumlar artık derleyici tarafından dikkate alınırlar ve bu nedenle hata oluşturabilirler:

// Bu satır
buradan devam edemez

Eğer yazacağınız yorum çok uzunsa ve alt satırlara geçmek istiyorsanız, geçtiğiniz satırlara da "//" karakterlerini eklemeniz gerekir:

// Bu satır
// artık buradan devam edebilir

Buna alternatif olarak C’de birden fazla satıra yorum eklemek için de bir yöntem bulunur. Eğer bir yorum bloğunu "/*" ile başlatıp "*/" ile bitirirseniz, arada kalan bütün satırlar yorum satırı olarak ele alınır. Çoklu yorum satırları (multi-line comments) olarak adlandırılan bu satırlar da programın derlemesine bir etki oluşturmazlar. Örnek:

/*
Bu satırlar arasındaki
her şey
yorum olarak
ele alınır
*/

Yine geleneksel olarak her bir satıra "*" koyup bir boşluk bırakmak okunabilirliği arttırır:

/*
* Bu satırlar arasındaki
* her şey
* yorum olarak
* ele alınır
*/

Çoklu yorum satırları içerisinde tekli yorum satırları eklemek herhangi bir hataya neden olmaz. Hatta bazı dokümantasyonlarda bu kullanım görülür. Ancak İç içe çoklu yorum satırı kullanmak hataya neden olur:

/*
// Geçerli
// Geçerli
*/

/*
/* Geçersiz */
*/

Önişlemci Bildirimleri

Üçüncü satırda yer alan #include ifadesi bir önişlemci bildirimini ifade eder. Önişlemci bildirimlerinden daha önce biraz bahsetmiştik. Farklı amaçlar için kullanılan çeşitli bildirimler mevcuttur. Burada kullanılan bildirim, programınızda kullanacağınız diğer kaynak kodları programınıza dahil etmek için kullanılır. Örneğin burada ekrana formatlı yazı basmak için kullanılan printf fonksiyonu stdio.h isimli standart kütüphane başlık dosyasında bildirildiğinden, bu başlık dosyası programa dahil edilmiştir. Başlık dosyası (header file), bir kodun tanımlanmış biçiminden ziyade (genellikle) sadece bildirimini içeren dosyalara verilen addır ve genellikle ".h" dosya uzantısına sahiptirler. Bildirim ve tanımlama konusuna daha sonra değineceğiz.

Herhangi bir başlık dosyasında veya kaynak kodda yer alan fonksiyonları kullanmak için, önce o kaynak kodu veya başlık dosyasını programınıza dahil etmeniz gerekir. İşte bunu #include önişlemci deyimi ile yapabilirsiniz. C dilinde farklı amaçlara hizmet eden birçok önişlemci bildirimi bulunmaktadır. Bazı bildirimler C derleyicilerinin hepsinde bulunsalar da bazıları sadece derleyiciye özeldir. #include bildirimi bütün derleyicilerde yer almaktadır. Yeri geldikçe diğer önişlemci bildirimlerinden de bahsedeceğim. Şimdilik diğer bildirimler hakkında ipucu edinmek için aşağıdaki figürü inceleyebilirsiniz:

Çeşitli Önişlemci Bildirimleri
Figür 1: Çeşitli Önişlemci Bildirimleri

Boşluklar ve Boşluk Karakterleri

Kodda bazı boş satırlar görmekteyiz. Boş satırların derlemeye hiçbir etkisi yoktur. Yalnızca okunabilirlik açısından boş satırların kullanılması önemlidir. Ekranda boşluk bırakan karakterlere boşluk karakterleri (white space characters) adı verilir. TAB ve Space tuşlarının, ayrıca Enter tuşunun ekranda bıraktığı boşluklar boşluk karakterlerine örnektir. Bu karakterlerin de C kodunda bir anlamı yoktur (tabi söz dizimi ile alakalı olan boşluklar hariç). Boş satırlar ve boşluk karakterlerinin kullanımı tamamen okunabilirlik ile alakalıdır. "Merhaba, Dünya!" örneğimizi şu şekilde yazdığımızı düşünelim:

#include <stdio.h>
int main(void){printf("Hello World!\n");}

Bu kodun ilk örnekten çalışma bakımından hiçbir farkı yoktur. İkisi de düzgün bir şekilde derlenir ve işini yapar. Ancak bu kodu okumanın ve anlamanın ilk koda göre daha zor olduğu açıktır. Bu nedenle kodunuzu yazarken boşluklara dikkat etmeniz önerilir.

Fonksiyonlar, İfadeler ve Deyimler

C programları bir veya birden fazla fonksiyondan meydana gelirler. Yukarıda gördüğünüz main isimli blok da bir fonksiyondur. Fonksiyonların söz dizimlerinden ve kullanımlarından daha sonra bahsedeceğiz. Burada değimek istediğim şey ise main fonksiyonunun görevi olacaktır. C programları main fonksiyonundan çalışmaya başlarlar. Diğer bütün fonksiyonların bir şekilde main fonksiyonuyla bağlantısı vardır. Süslü parantezlerin arasında kalan kısma fonksiyonun gövdesi (function body) adı verilir. Buradan fonksiyonun yaptığı işler yer alır. İşte main fonksiyonu da bazı işlemler yapmakta ve diğer fonksiyonları çağırabilmektedir. C dilinde süslü parantezler arasında kalan kısma blok (block) adı verilir.

Sekizinci satırda yer alan printf de bir fonksiyondur. Bu fonksiyon, parametre olarak aldığı metni ekrana basar. C dilinde ve diğer birçok programlama dilinde birden çok karakterden meydana gelen yapıya String (Dizge – Biz onu String olarak adlandıracağız.) adı verilir. İşte printf fonksiyonu da ilk parametresine ekrana basılacak String’i alır. C de String’ler çift tırnak işaretleri (") arasında belirtilir. Normalde boşluk karakterlerinin C kodunda bir anlamı olmadığından bahsetmiştik. Fakat bir String içerisinde kullanılan boşluk karakterleri programı etkileyecektir.

Sekizinci satırın sonunda bir noktalı virgül (;) görmekteyiz. Bu noktalı virgül C de deyim sonlandırıcısı (statement terminator) ismini alır. Bu karakter C dilinde gerçekten çok önemlidir. C dilinde de bir şeylerin anlamlı olabilmesi, yani bir şeylerin cümle belirtebilmesi için sonuna noktalı virgül konulması gerekir. Sonuna noktalı virgül konulmuş ifade veya ifade toplulukları artık deyim (statement) olarak adlandırılır. Deyimler C kodları içerisindeki cümlelerdir. Programlamaya yeni başlayanların (hatta bazen ileri seviye programcıların bile) yaptığı en büyük hatalardan biri deyim sonuna noktalı virgül koymayı unutmaktır. Bu da derleme hatalarına yol açmaktadır.

Peki ifade tam olarak nedir? C dilinde değişkenler, operatörler ve operandların bir kombinasyonundan meydana gelen yapılarak ifade (expression) adı verilmektedir. Örneğin a = b + c bir ifadedir. Fakat ifadeler C dilinde tek başlarına çok bir anlam ifade etmezler. Onların deyimler içerisinde kullanılması gerekir. Deyim ve ifadenin arasındaki fark şu şekilde örneklendirilebilir:

x = 6 + 5 // ifade
x = 6 + 5; // deyim

Kaçış Karakterleri

Son olarak bir konuya daha değinelim. Sekizinci satırda String sonunda yer alan özel iki karakteri farketmişsinizdir. C ve benzeri dillerde String içerisinde yer alan ters eğik çizgi işareti (\) kaçış karakteri (escape character) olarak adlandırılır. Eğer bir String’in içerisinde bu karakter kullanılırsa, bundan sonra gelen karaktere göre o String’de bir değişiklik yapılır. Örneğimizdeki "\n" ile tam bu karakterin bulunduğu yerde bir alt satıra geçip yazma işlemine devam edilir. Bu karakter ile başlayan ve devamında bir karakter alan karakter dizilerine kaçış dizgeleri (escape sequences) adı verilir. C’de birçok anlama gelen çeşitli kaçış dizgeleri mevcuttur. Bunlardan sık kullanılanlara bakacak olursak:

Kaçış Dizgesi Açıklama
\n Bir alt satıra geçme.
\t TAB boşluğu bırakma.
\a Alarm çalma.
\\ Ters eğik çizgi işaretini (\) kullanma.
\” Çift tırnak işaretini (“) kullanma.

Ters eğik çizgi işaretini ve çift tırnak işaretini bir String’de kullanmak için neden kaçış dizgelerine ihtiyaç duyulmaktadır? Derleyiciler bir String’in içinde ters eğik çizgi işaretini gördüğü zaman zaten bir sonraki karakterin özel bir anlama geldiğini yorumlarlar. Bu nedenle ters eğik çizgi işareti öyle olduğu gibi String içinde kullanılamaz. Aynı şekilde çift tırnak işaretini de derleyiciler String başlatıcısı veya sonlandırıcısı şeklinde yorumlarlar. Bu nedenle kaçış dizgeleriyle bu tip karakterler kullanılabilir hale gelmektedir.

Bu bölümde genel olarak bir C programının yapısından ve bileşenlerinden bahsettim. Ayrıca bu bölümde ekrana yazı yazmaya yaran printf fonksiyonunun en temel halini göstermiş oldum. Bunun yanında String’lere ve kaçış dizgelerine değindim. Fonksiyonlarla ilgili çok fazla ayrıntıya girmedim. Çünkü bu bölümlerde bir fonksiyondan bir başka fonksiyon çağırma veya yeni bir fonksiyon yazıp parametrelerini belirleme gibi konulardan daha sonra bahsedeceğim.

Referanslar

  1. The History of ‘Hello, World’
4.7 11 votes
Article Rating
Subscribe
Bildir
guest

0 Yorum
Eskiler
En Yeniler Beğenilenler