Standart C Programlama Dili


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.