7 Temmuz 2020 Salı

C programlama goto deyimi

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ı.

Hiç yorum yok:

Yorum Gönder

Her yorum bilgidir. Araştırmaya devam...