goto DEYİMİ: Diğer programlama dillerinde olduğu gibi C dilinde de programın akışı, bir koşula bağlı olmaksızın kaynak kod içinde başka bir noktaya yönlendirilebilir. Bu C dilinde goto deyimi ile yapılmaktadır. goto deyiminin genel sentaksı aşağıdaki şekildedir. <goto label;> .... <label:> <statement;> goto C dilinin 32 anahtar sözcüğünden biridir. (anahtar sözcüklerin küçük harfle yazıldıklarını tekrar hatırlatalım.) Label (etiket) programcının verdiği bir isimdir. Şüphesiz C dilinin isimlendirme kurallarına uygun olarak seçilmelidir. Programın akışı bu etiketin yerleştirilmiş olduğu yere yönlendirilecektir. Etiket, goto anahtar sözcüğünün kullanıldığı fonksiyon içinde, en az bir değimden önce olaçak şekilde, herhangi bir yere yerleştirilebilir. Etiket isminden sonra gelen : atomu sentaksı tamamlar. Etiketin goto anahtar sözcüğünden daha sonraki bir kaynak kod noktasına yerleştirilmesi zorunluluğu yoktur, goto anahtar sözcüğünden önce de tanımlanmış olabilir. Örneklerle açıklayalım: int main() { ... goto git; ... ... git: printf("goto deyimi ile buraya gelindi); return 0; } int main() { git: printf("goto deyimi ile gelinecek nokta); ... goto git; ... return 0; } goto etiketleri bir fonksiyon içerisinde, bir deyimden önce herhangi bir yere yerleştirilebilir. Yani aynı fonksiyon içinde bulunmak kaydıyla goto anahtar sözcüğünün yukarısına ya da aşağısına etiketi yerleştirebiliriz. Bu da aslında değişik bir faaliyet alanı tipidir. C dili standartlarında bu faaliyet alanı türüne "fonksiyon faaliyet alanı" denmiştir. Yapısal programlama tekniğinde goto deyiminin kullanılması tavsiye edilmez. Çünkü goto deyiminin kullanılması birtakım dezavantajlar doğurur: 1. goto deyimi programların okunabilirliğini bozar. Kodu takip eden kişi goto deyimiyle karşılaştığında fonksiyonun içinde etiketi arayacak, ve programı bu noktadan takip etmeye koyulacaktır. 2. goto deyimlerinin kullanıldığı bir programda bir değişiklik yapılması ya da programın, yapılacak eklemelerle, geliştirilmeye çalışılması daha zor olacaktır. Programın herhangi bir yerinde bir değişiklik yapılması durumunda, eğer program içerisinde başka yerlerden kodunakışı değişikliğin yapıldığı yere goto deyimleri ile atlatılmış ise, bu noktalarda da bir değişiklik yapılması gerekebilerecektir. Bu olumsuzluklara karşın, bazı durumlarda goto deyiminin kullanılması programın okunabilirliğini bozmak bir yana, diğer alternatiflere göre daha okunabilir bir yapının oluşmasına yardımcı olacaktır: İçiçe birden fazla döngü varsa, ve içteki döngülerden birindeyken, yalnızca bu döngüden değil, bütün döngülerden birden çıkılmak isteniyorsa goto deyimi kullanılmalıdır. Aşağıdaki kod parçasında içiçe 3 döngü bulunmaktadır. En içteki döngünün içinde func fonksiyonu çağırılarak fonksiyonun geri dönüş değeri test edilmekte, fonksiyon eğer 0 değerine geri dönüyorsa programın akışı goto deyimiyle tüm döngülerin dışına yönlendirilmektedir: int i, j, k; ... for (i = 0; i < 100; ++i) { ... for (j = 0; j < 100; ++j) { ... for (k = 0 { ... if (!func()) goto BREAK; ... } } } BREAK: printf("döngü dışındaki ilk deyim\n"); ... Oysa goto deyimini kullanmasaydık, ancak bir bayrak (flag) kullanarak, ve her döngünün çıkışında bayrak olarak kullanılan değişkenin değerinin değiştirilip değiştirilmediğini kontrol ederek bunu başarabilirdik: int i, j, k; int flag = 0; ... for (i = 0; i < 100; ++i) { ... for (j = 0; j < 100; ++j) { ... for (k = 0; k < 100; ++k) { ... if (!func()) { flag = 1; break; } ... } if (flag) break; } if (flag) break; } printf("döngü dışındaki ilk deyim\n"); ... Yine aşağıdaki kod parçasında goto deyimiyle hem switch deyimğinden hem de switch deyiminin içinde bulunduğu for döngüsünden çıkılmaktadır. ... int main() { int option; for (;;) { option = get_option(); switch (option) { case ADDREC :addrec();break; case LISTREC :listrec();break; case DELREC :delrec(); break; case SORTREC :sortrec(); break; case EXITPROG :goto EXIT; } } EXIT: return SUCCESS; } Yukarıdaki kod parçasında option değişkeninin değeri EXITPROG olduğunda programın akışı goto deyimiyle sonsuz döngünün dışına gönderilmiştir. goto deyimi yerine break anahtar sözcüğü kullanılsaydı, yalnızca switch deyiminden çıkılmış olunacaktı.
Sayfalar
▼
Menü
▼
Hiç yorum yok:
Yorum Gönder
Her yorum bilgidir. Araştırmaya devam...