Top Banner

of 31

C programlama ders 9

Apr 06, 2018

Download

Documents

Emre Dönmez
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
  • 8/3/2019 C programlama ders 9

    1/31

    nilemci Komutlar, switchve goto deyimleri

    r.Gr. Mahmut YALIN

    stanbul niversitesiElektrik Elektronik Mhendislii

    Kaynak:C ve Sistem ProgramclarDerneiKurs notu

  • 8/3/2019 C programlama ders 9

    2/31

    NLEMC KOMUTLARI (1)C derleyicileri iki ayr modlden oluur:

    1. nilemci Modl2. Derleme Modlnilemcinin, bilgisayarn ilemcisi ya da baka bir donanmsal elemanyla hibirilgisi yoktur. nilemci, belirli bir i gren bir yazlm programdr.nilemci, kaynak dosya zerinde birtakm dzenlemeler ve deiiklikler yapanbir n programdr. nilemci programnn bir girdisi bir de kts vardr.

    nilemcinin girdisi kaynak dosyann kendisidir. nilemci programn kts isederleme modlnn girdisini oluturur. Yani kaynak program ilk aamadanilemci tarafndan ele alnr. nilemci modl, kaynak dosyada eitlimetinsel dzenlemeler, deiiklikler yapar. Daha sonra deitirilmi ya dadzenlenmi olan bu kaynak dosya, derleme modl tarafndan amakoda dntrlr.

    stanbul niversitesiElektrik Elektronik Mhendislii

  • 8/3/2019 C programlama ders 9

    3/31

    C programlama dilinde # ile balayan btn satrlar, nilemci programa verilenkomutlardr (directives). nilemci program, nceden belirlenmi bir komut

    kmesindeki ilemleri yapabilir. Her bir komut, # atomunu izleyen bir szcklebelirlenir.nilemci program, ama kod oluturmaya ynelik hibir i yapmaz, kaynak kodiinde baz metinsel dzenlemeler yapar. Kendisine verilen komutlar yerinegetirdikten sonra, # ile balayan satrlar kaynak dosyadan siler. Derlememodlne girecek programda # ile balayan satrlar artk yer almaz.

    #include nilemci KomutuBu nilemci komutunun genel szdizimi aadaki gibidir:#include ya da#include "dosya ismi"#include komutu ile, ismi verilen dosyann ierii, bu komutun yazld yere

    yaptrlr. Bu komut ile nilemci, belirtilen dosyay diskten okuyarak komutunyazl olduu yere yerletirir. Bu komutla yaplan i, metin dzenleyiciprogramlardaki "kopyala - yaptr (copy paste) ilemine benzetilebilir.#include nilemci komutuyla, kaynak dosyaya eklenmek istenen dosyann ismiiki ayr biimde belirtilebilir:

    stanbul niversitesiElektrik Elektronik Mhendislii

  • 8/3/2019 C programlama ders 9

    4/31

    1. Asal ayra iinde:#include #include

    2. ift trnak iinde#include "general.h"#include "genetic.h"Dosya ismi eer asal ayra iinde verilmise, szkonusu dosya nilemcitarafndan, yalnzca nceden belirlenmi bir dizin iinde aranr.#define nilemci Komutu#definenilemci komutunun ilevi, metin dzenleyici programlardaki "bul-deitir (find-replace) zelliine benzetilebilir. Bu komut kaynak kod iindeki biryazy baka biryaz ile deitirmek iin kullanlr.nilemci, define szcnden sonraki boluklar atarak, boluksuz ilk yazkmesini elde eder. Bu yazya STR1 diyelim. Daha sonra satr sonuna kadarolan tm yaz kmesi elde edilir. Buna da STR2 diyelim. nilemci, kaynak kodiinde STR1 yazs yerine STR2yazsn yerletirir:#define SIZE 100nilemci komutuyla, nilemci kaynak kod iinde grd her birSIZE atomuyerine 100 atomunu yerletirir. Derleme modlne girecek kaynak programda,SIZE atomu artkyer almaz.

    stanbul niversitesiElektrik Elektronik Mhendislii

  • 8/3/2019 C programlama ders 9

    5/31

    #define nilemci komutu kullanlarak ounlukla bir isim, saysal bir deerle yerdeitirilir. Saysal bir deerle deitirilen isme, "simgesel deimez" (symbolicconstant) denir. Simgesel deimezler nesne deildir. Derleme modlne giren

    kaynak kodda, simgesel deimezlerin yerini saysal ifadeler alm olur.#define nilemci komutuyla tanmlanan isimlere, "basit makro" (simple macro)da denir. Simgesel deimezler, geleneksel olarak byk harf ile isimlendirilir.Bylece kodu okuyann deikenlerle, simgesel deimezleri ayrt edebilmesisalanr. Bilindii gibi C dilinde, deiken isimlendirmelerinde arlkl olarakkk harfler kullanlr. Bir simgesel deimez, baka bir simgesel deimezin

    tanmlamasnda kullanlabilir.rnein:#define MAX 100#define MIN (MAX - 50)Yer deitirme ilemi, STR1'in kaynak kod iinde bir atom halinde bulunmasdurumundayaplr:

    #define SIZE 100Bu tanmlamadan sonra kaynak koddasize = MAX_SIZE;printf("SIZE = %d\n", size);gibi deyimlerin bulunduunu dnelim. nilemci bu deyimlerin hibirinde birdeiiklik yapmaz.

    stanbul niversitesiElektrik Elektronik Mhendislii

  • 8/3/2019 C programlama ders 9

    6/31

    #define nilemci komutu ile deimezlere ve ilelere ilikin yer deitirme ilemiyaplamaz.Aadaki #define nilemci komutlar geerli deildir:#define + -

    #define 100 200Simgesel deimezler, C dilinin deiken isimlendirme kurallarna uygun olarakisimlendirilmelidir:#define BYK 10tanmlamas geersizdir.#define nilemci komutunda dizgeler de kullanlabilir:#define HATA_MESAJI "DOSYA AILAMIYOR\n"/***/printf(HATA_MESAJI);/***/Simgesel deimezler, yazlan kodun okunabilirliini ve alglanabilirliini artrr. Bazdeimezlere isimlerin verilmesi, bu deimezlerin ne amala kullanld hakknda dahafazla bilgi verilebilir. Aadaki rnee bakalm:

    #define PERSONEL_SAYISI 750void foo(){/***/if (x == PERSONEL_SAYISI)/***/}

    stanbul niversitesiElektrik Elektronik Mhendislii

  • 8/3/2019 C programlama ders 9

    7/31

    Simgesel Deimezlerin Tanmlanma Yerleri#define komutu kaynak kodun herhangi bir yerinde kullanlabilir. Ancak tanmlandyerden kaynak kodun sonuna kadar olan blge iinde etki gsterir. nilemci programdorudan bilinirlik alan kavramna sahip deildir. Bir bloun banda tanmlanan birsimgesel deimez yalnzca o bloun iinde deil tanmland yerden kaynak kodunsonuna kadar her yerde etkili olur.Simgesel deimezler bazen balk dosyasnn iinde bazen de kaynak dosyann iindetanmlanr.Simgesel Deimezlerin Kullanlmasnda Sk Yaplan HatalarTipk bir hata, simgesel deimez tanmlamasnda gereksiz yere '=' karakterinikullanmaktr:

    #define N = 100Bu durumda nilemci N grd yere= 100yazsn yaptrr. rneinint a[N];gibi bir tanmlama yapldn dnelim. nilemci bu tanmlamaya[= 100];

    biimine getirir ki bu da geersizdir.#define nilemci komutu satrn yanllkla ';' atomu ile sonlandrmak bir baka tipikhatadr.#define N 100;Bu durumda nilemci N grd yere100;

    yerletirir. stanbul niversitesiElektrik Elektronik Mhendislii

  • 8/3/2019 C programlama ders 9

    8/31

    int a[N];tanmlamasint a[100;];

    haline gelir. Bu tanmlama geersizdir. Bu tr hatalarda genellikle derleyici,simgesel deimez ka yerde kullanlmsa o kadar hata iletisi verir.Simgesel deimezlerin tanmlanmasnda dikkatli olunmaldr. nilemcimodlnn herhangi bir ekilde aritmetik ilem yapmad, yalnzca metinsel biryer deitirme yapt unutulmamaldr:#define MAX 10 + 20int main(){int result;result = MAX * 2;printf("%d\n", result);return 0;}Yukardaki rnekte result deikenine 60 deil 50 deeri atanr. Ancak nilemcikomutu#define MAX (10 + 20)biiminde yazlsayd , result deikenine 60 deeri atanm olurdu.

    stanbul niversitesiElektrik Elektronik Mhendislii

  • 8/3/2019 C programlama ders 9

    9/31

    int a[N];tanmlamasint a[100;];

    haline gelir. Bu tanmlama geersizdir. Bu tr hatalarda genellikle derleyici,simgesel deimez ka yerde kullanlmsa o kadar hata iletisi verir.Simgesel deimezlerin tanmlanmasnda dikkatli olunmaldr. nilemcimodlnn herhangi bir ekilde aritmetik ilem yapmad, yalnzca metinsel biryer deitirme yapt unutulmamaldr:#define MAX 10 + 20

    int main(){int result;result = MAX * 2;printf("%d\n", result);return 0;}Yukardaki rnekte result deikenine 60 deil 50 deeri atanr. Ancak nilemcikomutu#define MAX (10 + 20)biiminde yazlsayd , result deikenine 60 deeri atanm olurdu.

    stanbul niversitesiElektrik Elektronik Mhendislii

  • 8/3/2019 C programlama ders 9

    10/31

    switch DEYMswitch deyimi bir tamsay ifadesinin farkl deerleri iin, farkl ilerin yaplmasamacyla kullanlr. switch deyimi, zellikle else if merdivenlerine okunabilirlik

    ynnden birseenek oluturur.Deyimin genel biimi aadaki gibidir:switch (ifade) {case ifade1 :case ifade2 :case ifade3 :

    .......case ifade_n:default:}switch, case, ve default C dilinin anahtar szckleridir.switch Deyiminin Yrtlmesi

    switch ayrac iindeki ifadenin saysal deeri hesaplanr. Bu saysal deere eitdeerde bir case ifadesi olup olmad yukardan aa doru snanr. Eerbyle bir case ifadesibulunursa programn ak o case ifadesine geirilir. Artkprogram buradan akarak ilerler. switch ayrac iindeki ifadenin saysal deerihibir case ifadesine eit deilse, eer varsa, default anahtar szcnnbulunduu ksma geirilir.

    stanbul niversitesiElektrik Elektronik Mhendislii

  • 8/3/2019 C programlama ders 9

    11/31

    stanbul niversitesiElektrik Elektronik Mhendislii

    #include int main(){int a;

    printf("bir sayi girin : ");scanf("%d", &a);switch (a) {case 1: printf("bir\n");case 2: printf("iki\n");case 3: printf("\n");

    case 4: printf("drt\n");case 5: printf("be\n");}return 0;}Yukardaki rnekte scanf ilevi ile, klavyeden a deikenine 1 deeri alnmolsun. Budurumda programn ekran kts u ekilde olur:birikidrt

    be

  • 8/3/2019 C programlama ders 9

    12/31

    Eer uygun case ifadesi bulunduunda yalnzca bu ifadeye ilikin deyim(ler)inyrtlmesi istenirse break deyiminden faydalanlr. break deyiminin

    kullanlmasyla, dnglerden olduu gibi switch deyiminden de klr. Daha nceverilen rnee breakdeyimleri ekleniyor:#include int main(){int a;

    printf("bir sayi girin: ");scanf("%d", &a);switch (a) {case 1 : printf("bir\n"); break;case 2 : printf("iki\n"); break;case 3 : printf("\n"); break;

    case 4 : printf("drt\n"); break;case 5 : printf("be\n");}return 0;}

    stanbul niversitesiElektrik Elektronik Mhendislii

  • 8/3/2019 C programlama ders 9

    13/31

    case ifadelerini izleyen ":" atomundan sonra istenilen sayda deyim olabilir. Bir caseifadesini birden fazla deyimin izlemesi durumunda bu deyimlerin bloklanmasna gerekyoktur. Yani bir case ifadesini izleyen tm deyimler, bir blok iindeymi gibi ele alnr. caseifadelerinin belirli bir sray izlemesi gibi bir zorunluluk yoktur.default casedefault bir anahtar szcktr. switch deyimi gvdesine yerletirilen default anahtarszcn ':' atomu izler. Oluturulan bu case'e default case denir.Edeer bircase ifadesi bulunamazsa programn ak default case iine girer.Daha nce yazlan switch deyimine default case ekleniyor.#include int main()

    {int a;printf("bir sayi girin: ");scanf("%d", &a);switch (a) {case 1 : printf("bir\n"); break;case 2 : printf("iki\n"); break;

    case 3 : printf("\n"); break;case 4 : printf("drt\n"); break;case 5 : printf(be\n"); break;default: printf("hibiri\n");}return 0;

    } stanbul niversitesiElektrik Elektronik Mhendislii

  • 8/3/2019 C programlama ders 9

    14/31

    case ifadelerinin, tamsay trnden (integral types) deimez ifadesi olmas

    gerekir. Bilindii gibi deimez ifadeleri, derleme aamasnda derleyicitarafndan net saysal deerlere dntrlebilir:case 1 + 3: /* Geerli */mmkn nk 1 + 3 deimez ifadesi ama ,case x + 5: /* Geersiz */nk deimez ifadesi deil. Derleyici, derleme aamasnda saysal bir deer

    hesaplayamaz.case 'a' :Yukardaki case ifadesi geerlidir. 'a' bir karakter deimezidir. case ifadesitamsay trnden bir deimez ifadesidir.case 3.5 :Yukardaki case ifadesi geersizdir. 3.5 bir gerek say deimezidir.

    switch kontrol deyimi yerine bir else if merdiveni yazlabilir. Yani switch deyimiolmasayd, yaplmak istenen i, birelse if merdiveni ile de yaplabilirdi. Ancakbaz durumlarda else if merdiveni yerine switch deyimi kullanmak okunabilirliiartrr.

    stanbul niversitesiElektrik Elektronik Mhendislii

  • 8/3/2019 C programlama ders 9

    15/31

    if (a == 1)deyim1;

    else if (a == 2)deyim2;else if (a == 3)deyim3;else if (a == 4)deyim4;

    elsedeyim5;Yukardaki else if merdiveni ile aadaki switch deyimi ilevsel olarakedeerdir:switch (a) {case 1 : deyim1; break;

    case 2 : deyim1; break;case 3 : deyim1; break;case 4 : deyim1; break;default: deyim5;}

    stanbul niversitesiElektrik Elektronik Mhendislii

  • 8/3/2019 C programlama ders 9

    16/31

    Her switch deyiminin yerine ayn ii grecek ekilde bir else if merdiveni

    yazlabilir ama er else if merdiveni bir switch deyimiyle karlanamaz. switchayrac iindeki ifadenin birtamsay trnden olmas zorunludur. case ifadeleride tamsay trlerinden deimezifadesi olmak zorundadr. switch deyimi,tamsay trnden bir ifadenin deerinin deiiktamsay deerlerine eitliininsnanmas ve eitlik durumunda farkl ilerin yaplmas iin kullanlr. Oysa elseif merdiveninde her trl karlatrma sz konusu olabilir. rnek:if (x > 20)m = 5;else if (x > 30 && x < 55)m = 3;else if (x > 70 && x < 90)m = 7;elsem = 2;Yukardaki else if merdiveninin yerine bir switch deyimi yazlamaz.

    stanbul niversitesiElektrik Elektronik Mhendislii

  • 8/3/2019 C programlama ders 9

    17/31

    Birden fazla case ifadesi iin ayn ilemlerin yaplmas yle salanabilir.case 1:case 2:case 3:

    deyim1;deyim2;break;case 4:Bunu yapmann daha ksa bir yolu yoktur. Baz programclar kaynak kodun yerleiminiaadaki gibi dzenlerler:case 1: case 2: case 3: case 4: case 5:deyim1; deyim2;

    void print_season(int month){if (month == 12 || month == 1 || month == 2)printf("winter");

    else if (month == 3 || month == 4 || month == 5)printf("spring");else if (month == 6 || month == 7 || month == 8)printf("summer");else if (month == 9 || month == 10 || month == 11)printf("autumn");}

    stanbul niversitesiElektrik Elektronik Mhendislii

  • 8/3/2019 C programlama ders 9

    18/31

    Aadaki program nce inceleyin, sonra derleyerek altrn:

    void print_season(int month){switch (month) {case 12:case 1 :case 2 : printf("winter"); break;

    case 3 :case 4 :case 5 : printf("spring"); break;case 6 :case 7 :case 8 : printf("summer"); break;

    case 9 :case 10:case 11: printf("autumn");}}

    stanbul niversitesiElektrik Elektronik Mhendislii

  • 8/3/2019 C programlama ders 9

    19/31

    Simgesel deimezler, derleme ileminden nce nilemci tarafndan deitirilecei iin,case ifadelerinde yer alabilir:#define TRUE 1#define FALSE 0

    #define UNDEFINED 2case TRUE :case FALSE :case UNDEFINED :Yukardaki case ifadeleri geerlidir.case ifadeleri olarak karakter deimezleri de kullanlabilir:#include int main(){switch (getchar()) {case '0': printf("sfr\n"); break;case '1': printf("bir\n"); break;case '2': printf("iki\n"); break;

    case '3': printf("\n"); break;case '4': printf("drt\n"); break;case '5': printf("be\n"); break;default : printf("gecersiz!\n");}return 0;}

    stanbul niversitesiElektrik Elektronik Mhendislii

  • 8/3/2019 C programlama ders 9

    20/31

    Bir switch deyiminde ayn saysal deere sahip birden fazla case ifadesi olamaz.Budurum derleme zamannda hata oluturur.switch deyimi, baka bir switch deyiminin ya da bir dng deyiminin gvdesinioluturabilir:

    #include #include #define ESC 0X1Bint main(){int ch;

    while ((ch = getch()) != ESC)switch (rand() % 7 + 1) {case 1: printf("Pazartesi\n"); break;case 2: printf("Sali\n"); break;case 3: printf("Carsamba\n"); break;case 4: printf("Persembe\n"); break;

    case 5: printf("Cuma\n"); break;case 6: printf("Cumartesi\n"); break;case 7: printf("Pazar\n");}return 0;}

    stanbul niversitesiElektrik Elektronik Mhendislii

  • 8/3/2019 C programlama ders 9

    21/31

    rand leviStandart rand ilevi rastgele say retir. Bu ilevin bildirimi aadaki gibidir:int rand(void);C standartlar rand ilevinin rastgele say retimi konusunda kullanacaalgoritma ya dateknik zerinde bir koul koymamtr. Bu konu derleyiciyiyazanlarn seimine bal(implementation dependent) braklmtr. rand ilevininbildirimi, standart bir balkdosyas olan stdlib.h iindedir. Bu yzden rand

    ilevinin arlmas durumunda bu balkdosyas "include" nilemci komutuylakaynak koda eklenmelidir.#include rand ilevi her arldnda [0, RAND_MAX] aralnda rastgele bir tamsaydeerini geridndrr. RAND_MAX stdlib.h balk dosyas iinde tanmlanan birsimgesel deimezdir. C standartlar bu simgesel deimezin en az 32767

    deerinde olmasn art komaktadr. Derleyicilerin hemen hepsi RAND_MAXsimgesel deimezini 32767 olarak, yani 2 byte iaretli int trnn en bykdeeri olarak tanmlar:#define RAND_MAX 32767

    stanbul niversitesiElektrik Elektronik Mhendislii

  • 8/3/2019 C programlama ders 9

    22/31

    Aadaki program parasnda, 0 ile RAND_MAX arasnda 10 adet rastgele sayretilerekekrana yazdrlyor. Program derleyerek altrn:#include #include int main(){int k;

    for (k = 0; k < 10; ++k)printf("%d ", rand());return 0;}Aadaki program inceleyin. Programda display_date isimli bir ilevtanmlanyor. lev gn, ay ve yl deeri olarak ald bir tarih bilgisini ngilizce

    olarak aadaki formatta ekrana yazdryor:rnek:5th Jan 1998

    stanbul niversitesiElektrik Elektronik Mhendislii

  • 8/3/2019 C programlama ders 9

    23/31

    include void display_date(int day, int month, int year){printf("%d", day);switch (day) {case 1 :

    case 21 :case 31 : printf("st "); break;case 2 :case 22 : printf("nd "); break;case 3 :case 23 : printf("rd "); break;default : printf("th ");}

    switch (month) {case 1 : printf("Jan "); break;case 2 : printf("Feb "); break;case 3 : printf("Mar "); break;case 4 : printf("Apr "); break;case 5 : printf("May "); break;case 6 : printf("Jun "); break;

    case 7 : printf("Jul "); break;case 8 : printf("Aug "); break;case 9 : printf("Sep "); break;case 10: printf("Oct "); break;case 11: printf("Nov "); break;case 12: printf("Dec ");}printf("%d", year);

    } stanbul niversitesiElektrik Elektronik Mhendislii

  • 8/3/2019 C programlama ders 9

    24/31

    int main(){int day, month, year;int n = 20;while (n-- > 0) {printf("gun ay yil olarak bir tarih girin : ");scanf("%d%d%d", &day, &month, &year);display_date(day, month, year);

    putchar('\n');}return 0;}levin tanmnda iki ayr switch deyimi kullanlyor. lk switch deyimiyle, gndeeriniizleyen (th, st, nd, rd) sonekleri yazdrlrken, ikinci switch deyimiyle,

    aylara ilikin ksaltmalar (Jan, Feb. Mar.) yazdrlyor.case ifadelerini izleyen deyimlerden biri break deyimi olmak zorunda deildir.Baz durumlarda break deyimi zellikle kullanlmaz, uygun bir case ifadesibulunduunda daha aadaki case lerin iindeki deyimlerin de yaplmaszellikle istenir. Aadaki program derleyerek altrn:

    stanbul niversitesiElektrik Elektronik Mhendislii

  • 8/3/2019 C programlama ders 9

    25/31

    #include int isleap(int y){return y % 4 == 0 && (y % 100 != 0 || y % 400 == 0);

    }int day_of_year(int day, int month, int year){int sum = day;switch (month - 1) {case 11: sum += 30;

    case 10: sum += 31;case 9 : sum += 30;case 8 : sum += 31;case 7 : sum += 31;case 6 : sum += 30;case 5 : sum += 31;case 4 : sum += 30;

    case 3 : sum += 31;case 2 : sum += 28 + isleap(year);case 1 : sum += 31;}return sum;}

    stanbul niversitesiElektrik Elektronik Mhendislii

  • 8/3/2019 C programlama ders 9

    26/31

    int main(){int day, month, year;int n = 5;while (n-- > 0) {printf("gun ay yil olarak bir tarih girin : ");

    scanf("%d%d%d", &day, &month, &year);printf("%d yilinin %d. gunudur!\n", year, day_of_year(day, month,year));}return 0;}

    day_of_year ilevi dardan gn, ay ve yl deeri olarak gelen tarih bilgisinin ilgili ylnkanc gn olduunu hesaplayarak bu deerle geri dnyor.

    stanbul niversitesiElektrik Elektronik Mhendislii

  • 8/3/2019 C programlama ders 9

    27/31

    goto DEYMDier programlama dillerinde olduu gibi C dilinde de programn ak, bir koulabal olmakszn kaynak kod iinde baka bir noktaya ynlendirilebilir. Bu, Cdilinde gotodeyimi ile yaplr:goto deyiminin genel szdizimi aadaki gibidir:....

    goto, C dilinin 32 anahtar szcnden biridir. Etiket (label), programcnnverdii birisimdir. phesiz isimlendirme kurallarna uygun olarak seilmelidir.Programn ak, bu etiketin yerletirilmi olduu yere ynlendirilir. Etiket, gotoanahtar szcnn kullanld ilev iinde herhangi bir yere yerletirilebilir.Etiket isminden sonra ':' atomuyer almak zorundadr. Etiketi izleyen deyim de

    goto kontrol deyiminin szdiziminin birparasdr. Etiketten sonra bir deyimin yeralmamas bir szdizim hatasdr.Etiketin goto anahtar szcnden daha sonraki bir kaynak kod noktasnayerletirilmesizorunluluu yoktur. Etiket goto anahtar szcnden nce detanmlanm olabilir:

    stanbul niversitesiElektrik Elektronik Mhendislii

  • 8/3/2019 C programlama ders 9

    28/31

    int main(){/***/

    goto GIT;/***/GIT:printf("goto deyimi ile buraya gelindi\n");return 0;}

    Yukardaki programda, etiket goto anahtar szcnden daha sonra yer alyor.int main(){GIT:printf("goto deyimi ile gelinecek nokta\n");/***/goto GIT;/***/return 0;}Yukardaki programda, etiket goto anahtar szcnden daha nce yer alyor.

    stanbul niversitesiElektrik Elektronik Mhendislii

  • 8/3/2019 C programlama ders 9

    29/31

    goto etiketleri, geleneksel olarak byk harf ile, birinci stuna dayal olarakyazlr. Bylece kaynak kod iinde daha fazla dikkat ekerler.

    goto etiketleri bir ilev iinde, bir deyimden nce herhangi bir yere yerletirilebilir.Yanietiket, ayn ilev iinde bulunmak kouluyla, goto anahtar szcnnyukarsna ya da aasna yerletirilebilir. Bu zelliiyle goto etiketleri, yeni birbilinirlik alan kural oluturur.Yapsal programlama tekniinde goto deyiminin kullanlmas nerilmez. nkgotodeyiminin kullanlmas bir takm sakncalar dourur:

    1. goto deyimi programlarn okunabilirliini bozar. Kodu okuyan kii gotodeyimiylekarlatnda ilevin iinde etiketi arayp bulmak zorunda kalr veprogram bu noktadan okumay srdrr.2. goto deyimlerinin kullanld bir programda bir deiiklik yaplmas ya daprogramn, yaplacak eklemelerle, gelitirilmeye allmas daha zor olur.Programn herhangi bir yerinde bir deiiklik yaplmas durumunda, eerprogram iinde baka yerlerden deiikliin yapld yere goto deyimleri ilesrama yaplm ise, bu noktalarda da birdeiiklik yaplmas gerekebilir. Yanigoto deyimi program paralarnn birbirine olan bamlln artrr, bu da genelolarak istenen bir ey deildir.

    stanbul niversitesiElektrik Elektronik Mhendislii

  • 8/3/2019 C programlama ders 9

    30/31

    Bu olumsuzluklara karn, baz durumlarda goto deyiminin kullanlmas programnokunabilirliini bozmak bir yana, dier seeneklere gre daha okunabilir bir yapnnolumasna yardmc olur:ie birden fazla dng varsa, ve iteki dnglerden birindeyken, yalnzca bu dngden

    deil, btn dnglerden birden klmak isteniyorsa goto deyimi kullanlmaldr.#include int test_func(int val);int main(){int i, j, k;for (i = 0; i < 100; ++i) {

    for (j = 0; j < 100; ++j) {for (k = 0; k < 20; ++k) {/*...*/if (!test_func(k))goto BREAK;/*...*/

    }}}BREAK:printf("dng dndaki ilk deyim\n");return 0;}

    stanbul niversitesiElektrik Elektronik Mhendislii

  • 8/3/2019 C programlama ders 9

    31/31

    TO BE CONTINUED...