2.10. goto
Deyimi Ve Etiketler
Her C deyimine, deyimden önce bir tanıtıcı sözcük ve
iki nokta üst üste koyarak bir etiket iliştirilebilir. Bir deyimi
etiketlemek suretiyle, gerektiğinde o deyime ulaşmak için kullanılabilecek bir
adres
verilir. Bir fonksiyon içinde birden fazla deyime aynı isim,
etiket olarak, verilemez. Bir etiket ve onun arkasına bir deyim yeni bir deyim
oluşturur. Bu tür bir deyime etiketli deyim denir:
tanıtıcı_sözcük : deyim
goto
deyimi, kontrolü doğrudan etiketli deyime
aktarır. Sözdizimi söyledir:
goto tanıtıcı_sözcük;
Tanıtıcı_sözcük aynı fonksiyon içinde var olan bir etiket olmalıdır.
goto
kullanarak, fonksiyon içinde (dışında değil)
herhangi bir yere atlanabilir; ileri veya geriye doğru, istenildiği kadar
içiçe geçmiş döngü veya blokların içine veya dışına, istediğiniz bir yere
gidebilirsiniz. goto
’nun
sorumsuzca kullanımı, anlaşılması ve bakımı yapılması olanaksız programlar
yaratabilir. Kuramsal olarak, anlambilimsel hiçbir yitime uğratılmadan,
goto
bir programdan çıkarılıp yerine
döngü ve if
deyimleri konulabilir.
Buna rağmen, hata işleme gibi, bazı durumlarda işleri kolaylaştırabilir.
Örneğin:
while (bir_kosul) { … do { … for (…; …; …) { … if (guuum) goto felaket; … } /* for */ } while (baska_kosul); … } … felaket : hata işlemleri
Bu durumda bile, goto
deyimi kaldırılabilir.
Hata işlemlerinin, bazı temizlik işleri yapıp, olası bir hata kodu
ile, çağıran fonksiyona dönüş yaptığını varsayın. O zaman, niye bu işleri
goto
deyiminin bulunduğu yerde yapıp bir
return
kullanmayalım? (return
deyimi bir fonksiyondan dönmek için kullanılır ve
Bölüm 4’te işlenmektedir.)
break
, continue
ve return
gibi daha uygun yapıların bulunduğu, C gibi
bir dilde, goto
’lardan kaçınılabilir ve
kaçınılmalıdır. İyi bir programcı goto
’yu ve
hatta continue
’yu hemen hiçbir zaman kullanmaz.
switch
dışında da, break
deyimini
çok seyrek kullanır. Bu arada, goto
kullanmadan bile,
kontrol akışı anlaşılmayan programlar yazmak olasıdır. Dikkatli tasarım,
ayrıntılı belgeleme ve makul içerlek yazma alışkanlığı, bundan kaçınmanın bazı
yollarıdır.
İleride göreceğimiz gibi, goto
deyimi aynı
fonksiyon içinde atlamalar için kullanılır. Farklı fonksiyonlar arasında
atlama yapmak için
setjmp
ve longjmp
kullanılabilir.