c programlama kitabı (necati ergin)

529
 C ve Sistem Programclar Derne!i - C Ders Notlar - Necati Ergin 1/529 $Ç$NDEK$LER Programlama ve C 3 Say  Sistemleri 15 Genel Kavramler ve Terimler 25 Bir C Program  Olu!turmak 31 Veri Türleri 33 Bildirim ve Tan mlama 39 De"i !mezler 45 %!levler 53 %!leçler 73 Bilinirlik Alan ve Ömür 93 Kontrol Deyimleri 101 if Deyimi 102 %!lev Bildirimleri 119 Tür Dönü!ümleri 127 Döngü Deyimleri 137 Ko!ul %!leci 159 Öni ! lemci Komutlar - 1 165 Switch Deyimi 175 goto Deyimi 185 Rastgele Say  Üretimi ve Kontrol Deyimlerine %li ! kin Genel Uygulamalar 189 Diziler 199 char Türden Diziler ve Yazlar 215 sizeof %!leci 226 Göstericiler 229 Gösterici %!leçleri 235 Yazlarla %lgili %!lem Yapan Standart %!levler 265 Gösterici Hatalar  280 void Türden Göstericiler 283 Dizgeler 291 Gösterici Dizileri 301 Göstericiyi Gösteren Gösterici 307 Çok Boyutlu Diziler 311 exit, abort atexit %!levleri 321 Dinamik Bellek Yönetimi 323 Belirleyiciler ve Niteleyiciler 341 Yap lar 359 Tür %simleri Bildirimleri ve typedef Belirleyicisi 387 Tarih ve Zaman ile % lgili %!lem Yapan Standart %!levler 397 Birlikler 411 Numaraland rmalar 421 Bitsel %!leçler 427 Bit Alanlar  441 Komut Sat r Argümanlar  445 Dosyalar 451 Makrolar 485 Öni ! lemci Komutlar - 2 495 %!lev Göstericileri 505 Özyinelemeli %!levler 519 De"i !ken Say da Arguman Alan %!levler 525 Kaynaklar 529

Upload: emre-doenmez

Post on 11-Jul-2015

1.225 views

Category:

Documents


0 download

TRANSCRIPT

C ve Sistem Programclar Dernei - C Ders Notlar - Necati Ergin

NDEKLERProgramlama ve C Say Sistemleri Genel Kavramler ve Terimler Bir C Program Oluturmak Veri Trleri Bildirim ve Tanmlama Deimezler levler leler Bilinirlik Alan ve mr Kontrol Deyimleri if Deyimi lev Bildirimleri Tr Dnmleri Dng Deyimleri Koul leci nilemci Komutlar - 1 Switch Deyimi goto Deyimi Rastgele Say retimi ve Kontrol Deyimlerine likin Genel Uygulamalar Diziler char Trden Diziler ve Yazlar sizeof leci Gstericiler Gsterici leleri Yazlarla lgili lem Yapan Standart levler Gsterici Hatalar void Trden Gstericiler Dizgeler Gsterici Dizileri Gstericiyi Gsteren Gsterici ok Boyutlu Diziler exit, abort atexit levleri Dinamik Bellek Ynetimi Belirleyiciler ve Niteleyiciler Yaplar Tr simleri Bildirimleri ve typedef Belirleyicisi Tarih ve Zaman ile lgili lem Yapan Standart levler Birlikler Numaralandrmalar Bitsel leler Bit Alanlar Komut Satr Argmanlar Dosyalar Makrolar nilemci Komutlar - 2 lev Gstericileri zyinelemeli levler Deiken Sayda Arguman Alan levler Kaynaklar 3 15 25 31 33 39 45 53 73 93 101 102 119 127 137 159 165 175 185 189 199 215 226 229 235 265 280 283 291 301 307 311 321 323 341 359 387 397 411 421 427 441 445 451 485 495 505 519 525 529

1/529

C ve Sistem Programclar Dernei - C Ders Notlar - Necati Ergin

PROGRAMLAMA ve CYazlm (software), programlama ve programlamayla ilgili konularn geneline verilen isimdir. Yazlm denince akla programlama dilleri bu diller kullanlarak yazlm kaynak programlar ve oluturulan eitli dosyalar gelir.

Yazlm Nedir

Donanm Nedir

Donanm (hardware), bilgisayarn elektronik ksm, yapsna verilen isimdir.

Yazlmn Snflandrlmas

Yazlm uygulama alanlarna gre eitli gruplara ayrlabilir:

1. Bilimsel yazlmlar ve mhendislik yazlmlar Bilimsel konularda ve mhendislik uygulamalarndaki problemlerin zlmesinde kullanlan yazlmlardr. Bu tr yazlmlarda veri miktar greli olarak dktr ancak matematiksel ve istatistiksel algoritmalar youn olarak kullanlr. Byle programlar arlkl olarak hesaplamaya ynelik ilemler ierir ve bilgisayarn merkezi ilem birimini (CPU) youn bir biimde kullanr. Elektronik devrelerin zmn yapan programlar, istatistik analiz paketleri, bu tr programlara rnek olarak verilebilir. 2. Uygulama yazlmlar Veri taban arlkl yazlmlardr. Genel olarak verilerin yaratlmas, ilenmesi ve dosyalarda saklanmas ile ilgilidir. Bu tr programlara rnek olarak stok kontrol programlar, mteri izleme programlar, muhasebe programlar verilebilir. 3. Yapay zeka yazlmlar nsann dnsel ya da renmeye ynelik davranlarn taklit eden yazlmlardr. rnek olarak robot yazlmlar, satran ya da bri oynatan programlar vs. verilebilir. 4. Grntsel yazlmlar Grntsel ilemlerin ve algoritmalarn ok youn olarak kullanld programlardr. rnek olarak oyun ve canlandrma (animasyon) yazlmlar verilebilir. Bu yazlmlar arlkl olarak bilgisayarn grafik arabirimini kullanr. 5. Simlasyon yazlmlar Bir sistemi bilgisayar ortamnda simle etmek iin kullanlan yazlmlardr. 6. Sistem yazlmlar Bilgisayarn elektronik yapsn yneten yazlmlardr. Derleyiciler, haberleme programlar, iletim sistemleri birer sistem yazlmdr. rnein bir metin ileme program da bir sistem yazlmdr. Uygulama programlarna gre daha dk dzeyli ilem yaparlar.

Kaynaklar u an halen kullanmda olan yaklak 1000 - 1500 programlama dilinin varlndan sz ediyor. Neden bu kadar fazla programlama dili var? Bu kadar fazla programlama dili olmasna karn neden halen yeni programlama dilleri tasarlanyor? Bir programlama dilini dierine ya da dierlerine gre farkl klan zellikler neler olabilir? Bir programlama dilini tanmlamak gerekirse hangi niteleyiciler kullanlabilir? Bu sorulara yant verebilmek iin deerlendirme yapmaya olanak salayan ltler olmaldr. Aada bu ltler ksaca inceleniyor:

Programlama Dillerinin Deerleme ltleri

3/529

C ve Sistem Programclar Dernei - C Ders Notlar - Necati Ergin

Bir programlama dilinin seviyesi (level) o programlama dilinin insan algsna ya da makineye yaknlnn lsdr. Bir programlama dili insan alglasna ne kadar yaknsa o kadar yksek seviyeli (high level) demektir. Yine bir programlama dili bilgisayarn elektronik yapsna ve alma biimine ne kadar yaknsa o kadar dk seviyeli (low level) demektir. Bilgisayarn ilemcisinin anlad bir "komut takm" (instruction set) vardr. lemci yalnzca kendi komut takm iinde yer alan komutlar altrabilir. Programlama dilinde yazlan metin, baz sreler sonunda bilgisayarn ilemcisinin komut takmnda yer alan komutlara dntrlr. Yksek seviyeli dillerle almak programc asndan kolaydr, iyi bir algoritma bilgisi gerektirmez. Bu dillerde yalnzca nelerin yaplaca programa bildirilir ama nasl yaplaca bildirilmez. Genel olarak programlama dilinin dzeyi ykseldike, o dilin renilmesi ve o dilde program yazlmas kolaylar. Makine dili bilgisayarn doal dilidir, bilgisayarn donanmsal tasarmna baldr. Bilgisayarlarn gelitirilmesiyle birlikte onlara i yaptrmak iin kullanlan ilk diller, makine dilleri olmutur. Bu yzden makine dillerine birinci kuak diller de denir. Makine dilinin programlarda kullanlmasnda karlalan iki temel sorun vardr. Makine dilinde yazlan kodlar dorudan makinenin ilemcisine, donanm paralarna verilen komutlardr. Deiik bir CPU kullanldnda ya da bellek dzenlemesi farkl bir ekilde yapldnda artk program almaz, programn yeniden yazlmas gerekir. nk makine dili yalnzca belirli bir CPU ya da CPU serisine uygulanabilir. Makine dili tanabilir (portable) deildir. Dier nemli bir sorun ise, makine dilinde kod yazmann ok zahmetli olmasdr. Yazmann ok zaman alc ve uratrc olmasnn yan sra yazlan program okumak ya da alglamak da o denli zordur. zellikle program boyutu bydnde artk makine dilinde yazlan programlar gelitirmek, bytmek, iyice karmak bir hale gelir. Balangta yalnzca makine dili vard. Bu yzden makine dilleri 1. kuak diller olarak da isimlendirilir. Yazlmn ve donanmn tarihsel geliimi iinde makine dilinden, insan alglamasna ok yakn yksek seviyeli dillere (4. kuak diller) kadar uzanan bir sre sz konusudur. 1950'li yllarn hemen balarnda makine dili kullanmnn getirdii sorunlar ortadan kaldrmaya ynelik almalar younlat. Bu yllarda makine dillerinde yazlan programlar bilgisayarn ok snrl olan belleine ykleniyor, byle altrlyordu. lk nce makine dilinin alglanma ve anlalma zorluunu ksmen de olsa ortadan kaldran bir adm atld. Simgesel makine dilleri gelitirildi. Simgesel makine dilleri (Assembly Languages) makine komutlarndan birka tanesini paketleyen baz ksaltma szcklerden, komutlardan oluuyordu. Simgesel makine dillerinin kullanm ksa srede yaygnlat. Ancak simgesel makine dillerinin makine dillerine gre ok nemli bir dezavantaj sz konusuydu. Bu dillerde yazlan programlar makine dilinde yazlan programlar gibi bilgisayarn belleine ykleniyor ancak programn altrlma aamasnda yorumlayc (interpreter) bir program yardmyla simgesel dilin komutlar, bilgisayar tarafndan komut komut makine diline evriliyor ve oluan makine kodu altrlyordu. Yani bilgisayar, program alma aamasnda nce yorumlayarak makine diline eviriyor, daha sonra makine diline evrilmi komutlar yrtyordu. Programlar bu ekilde altrldnda neredeyse 30 kat yavalyordu. Bu dnemde zellikle iki yorumlayc program ne kmt: John Mauchly'nin UNIVAC 1 iin yazd yorumlayc (1950) ve John Backus tarafndan 1953 ylnda IBM 701 iin yazlan "Speedcoding" yorumlama sistemi. Bu tr yorumlayclar, makine koduna gre ok yava alsalar da programclarn verimlerini artryorlard. Ama zellikle eski makine dili programclar, yorumlayclarn ok yava olduklarn, yalnzca makine dilinde yazlan programlara gerek program denebileceini sylyorlard. Bu sorunun da stesinden gelindi. O zamanlar iin ok parlak kabul edilebilecek fikir uydu: Kodun her altrlmasnda yazlan kod makine diline evrileceine, gelitirilecek bir baka program simgesel dilde yazlan kodu bir kez makine diline evirsin ve artk program ne zaman altrlmak istense, bilgisayar, yorumlama olmakszn yalnzca makine kodunu altrsn. Bu fikri Grace Hopper gelitirmiti. Grace Hopper'n buluuna

Seviye

4/529

C ve Sistem Programclar Dernei - C Ders Notlar - Necati Ergin

"compiler" derleyici ismi verildi. (Grace Hopper ayn zamanda Cobol dilini gelitiren ekipten biridir, bug(bcek) szcn ilk olarak Grace Hopper kullanmtr.) Artk programclar, simgesel szcklerden oluan Assembly programlama dillerini kullanyor, yazdklar programlar derleyici tarafndan makine koduna dntrlyor ve makine kodu eski hzndan bir ey yitirmeksizin tam hzla alyordu. Assembly diller 2. kuak diller olarak tarihte yerini ald. Assembly dillerinin kullanlmaya balamasyla bilgisayar kullanm hzla artt. Ancak en basit ilemlerin bile bilgisayara yaptrlmas iin birok komut gerekmesi, programlama srecini hzlandrma ve kolaylatrma araylarn balatt, bunun sonucunda da daha yksek seviyeli programlama dilleri gelitirilmeye baland. Tarihsel sre iinde Assembly dillerinden daha sonra gelitirilmi ve daha yksek seviyeli diller 3. kuak diller saylr. Bu dillerin hepsi algoritmik dillerdir. Bugne kadar gelitirilmi olan yzlerce yksek seviyeli programlama dilinden pek az bugne kadar varlklarn srdrebilmitir. 3. kuak dillerin hemen hemen hepsi ana dilden tretilmitir. 3. kuak dillerin ilkleri olan bu dil halen varlklarn srdrmektedir: FORTRAN dili (FORmula TRANslator) karmak matematiksel hesaplamalar gerektiren mhendislik ve bilimsel uygulamalarda kullanlmak zere 1954 - 1957 yllar arasnda IBM firmas iin John Backus tarafndan gelitirildi. FORTRAN dili, youn matematik hesaplamalarn gerektii bilimsel uygulamalarda halen kullanlmaktadr. FORTRAN dilinin FORTRAN IV ve FORTRAN 77 olmak zere iki nemli srm vardr. Doksanl yllarn balarnda FORTRAN - 90 isimli bir srm iin ISO ve ANSI standartlar kabul edilmitir. FORTRAN dili, 3. kuak dillerin en eskisi kabul edilir. COBOL (COmmon Business Oriented Language) 1959 ylnda, Amerika'daki bilgisayar reticileri, zel sektr ve devlet sektrndeki bilgisayar kullanclarndan oluan bir grup tarafndan gelitirildi. COBOL'un gelitirilme amac, veri ynetiminin gerektii ticari uygulamalarda kullanlacak tanabilir bir programlama dili kullanmakt. COBOL dili de halen yaygn olarak kullanlyor. ALGOL (The ALGOritmick Language) 1958 ylnda Avrupa'da bir konsorsiyum tarafndan gelitirildi. IBM Firmas FORTRAN dilini kendi donanmlarnda kullanlacak ortak programlama dili olarak benimsediinden, Avrupa'llar da seenek bir dil gelitirmek istemilerdi. ALGOL dilinde gelitirilen birok tasarm zellii, modern programlama dillerinin hepsinde kullanlmaktadr. 60'l yllarn balarnda programlama dilleri zerinde yaplan almalar yapsal programlama kavramn gndeme getirdi. PASCAL dili 1971 ylnda akademik evrelere yapsal programlama kavramn tantmak iin Profesr Niclaus Wirth tarafndan gelitirildi. Dilin yaratcs, dile matematiki ve filozof Blaise Pascal'n ismini vermitir. Bu dil, ksa zaman iinde niversitelerde kullanlan programlama dili durumuna geldi. Pascal dilinin ticari ve endstriyel uygulamalar desteklemek iin sahip olmas gereken bir takm zelliklerden yoksun olmas, bu dilin kullanmn kstlamtr. Modula ve Modula-2 dilleri Pascal dili temel alnarak gelitirilmitir. BASIC dili 1960'l yllarn ortalarnda John Kemeney ve Thomas Kurtz tarafndan gelitirildi. BASIC isminin "Beginner's All Purpose Symbolic Instruction Code" szcklerinin ba harflerinden oluturulduu sylenir. Yksek seviyeli dillerin en eski ve en basit olanlarndan biridir. Tm basitliine karn, birok ticari uygulamada kullanlmtr. BASIC dili de ANSI tarafndan standartlatrlmtr. Ancak BASIC dilinin ek zellikler ieren srmleri sz konusudur. rnein Microsoft firmasnn kartt Visual Basic diline nesne ynelimli programlamaya ilikin birok zellik eklendi. Daha sonra bu dil Visual Basic dot Net ismini ald. Ayrca BASIC dilinin baz srmleri uygulama programlarnda -rnein MS Excel ve MS Word programlarnda- kullancnn zelletirme ve otomatikletirme amacyla yazaca makrolarn yazlmasnda kullanlan programlama dili olarak da genel kabul grd. ADA dili ise Amerikan Savunma Departman (Department of Defence -DoD) destei ile 70'li yllardan balanarak gelitirildi. DoD, dnyadaki en byk bilgisayar kullanclarndan biridir. Bu kurum farkl yazlmsal gereksinimleri karlamak iin ok sayda farkl programlama dili kullanyordu ve tm gereksinmelerini karlayacak bir dil arayna girdi. Dilin tasarlanmas amacyla uluslararas bir yarma dzenledi. Yarmay kazanan irket (CII-Honeywell Bull of France) Pascal dilini temel alarak balatt

5/529

C ve Sistem Programclar Dernei - C Ders Notlar - Necati Ergin

almalarnn sonucunda Ada dilini gelitirdi. Ada dilinin dokmanlar 1983 ylnda yaymland. Ada ismi, dnr Lord Byron'un kz olan Lady Ada Lovelace'n ismine gndermedir. Ada Lovelace delikli kartlar hesap makinelerinde ilk olarak kullanlan Charles Babbage'in yardmcsyd. Charles Babbage hayat boyunca "Fark Makinesi" (Difference Engine) ve "Analitik Makine" (Analytical Engine) isimli makinelerin yapm zerinde alt ama bu projelerini gerekletiremeden ld. Yine de gelitirdii tasarmlar modern bilgisayarlarn atas kabul edilir. Ada Lovelace, Charles Babbage'n makinesi iin delikli kartlar ve kullanlacak algoritmalar hazrlyordu. Lovelace'in 1800'l yllarn banda ilk bilgisayar programn yazd kabul edilir. Ada genel amal bir dildir, ticari uygulamalardan roketlerin ynlendirilmesine kadar birok farkl alanda kullanlmaktadr. Dilin nemli zelliklerinden biri, gerek zaman uygulamalarna (real-time applications / embedded systems) destek vermesidir. Baka bir zellii de yksek modler yaps nedeniyle byk programlarn yazmn kolaylatrmasdr. Ancak byk, karmak derleyicilere gereksinim duymas; C, Modula-2 ve C++ dillerine kar rekabetini zorlatrmtr. ok yksek seviyeli ve genellikle algoritmik yap iermeyen programlarn grsel bir ortamda yazld diller ise 4. kuak diller olarak isimlendirilirler. Genellikle 4GL (fourth generation language) olarak ksaltlrlar. nsan algsna en yakn dillerdir. RPG dili 4. kuak dillerin ilki olarak kabul edilebilir. zellikle kk IBM makinelerinin kullanclar olan irketlerin, rapor retimi iin kolay bir dil istemeleri zerine IBM firmas tarafndan gelitirilmitir. Programlama dilleri dzeylerine gre baz gruplara ayrlabilir: ok yksek dzeyli diller ya da grsel diller ya da ortamlar (visual languages): Access, Foxpro, Paradox, Xbase, Visual Basic, Oracle Forms. Yksek dzeyli diller. Fortran, Pascal, Basic, Cobol. Orta dzeyli programlama dilleri: Ada, C. (Orta seviyeli diller daha az kaypla makine diline evrilebildiinden daha hzl alr.) Dk dzeyli programlama dilleri: Simgesel makine dili (Assembly language). Makine dili: En aa seviyeli programlama dili. Saf makine dili tamamen 1 ve 0 lardan oluur.

Okunabilirlik (readability) kaynak kodun abuk ve iyi bir biimde alglanabilmesi anlamna gelen bir terimdir. Kaynak kodun okunabilirlii sz konusu olduunda sorumluluk byk lde program yazan programcdadr. Fakat yine verimlilikte olduu gibi dillerin bir ksmnda okunabilirlii glendiren yap ve aralar bulunduu iin bu zellik bir lde programlama dilinin tasarmna da baldr. En iyi program kodu, sanld gibi "en zekice yazlm fakat kimsenin anlayamayaca" kod deildir. Birok durumda iyi programclar okunabilirlii hibir eye feda etmek istemezler. nk okunabilir bir program kolay alglanabilme zelliinden dolay yllar sonra bile gncelletirmeye olanak salar. Birok programcnn ortak kodlar zerinde alt geni kapsaml projelerde okunabilirlik daha da nem kazanr. C'de okunabilirlik en fazla vurgulanan kavramlardan biridir. lerideki birok blmde okunabilirlik konusuna sk sk deinildiini greceksiniz.

Okunabilirlik

6/529

C ve Sistem Programclar Dernei - C Ders Notlar - Necati Ergin

Tanabilirlik (portability) bir sistem iin yazlm olan kaynak kodun baka bir sisteme gtrldnde, hatasz bir biimde derlenerek, doru bir ekilde altrlabilmesi demektir. Tanabilirlik standardizasyon anlamna da gelir. Programlama dilleri (ISO International Standard Organization) ve ANSI (American National Standard Institute) tarafndan standardize edilirler. lk olarak 1989 ylnda standartlar oluturulan C Dili, dier programlama dillerinden daha tanabilir bir programlama dilidir.

Tanabilirlik

Verimlilik (Efficiency) bir programn hzl almas ve daha az bellek kullanma zelliidir. Programn alma hz ve kulland bellek miktar pek ok etkene baldr. phesiz kullanlan algoritmann da hz ve kullanlan bellek zerinde etkisi vardr. Programn altrld bilgisayarn da doal olarak hz zerinde etkisi vardr. Verimlilik bir programlama dilinde yazlm bir programn altrldnda kulland bellek alan ve alma hz ile ilgili bir kstas olarak ele alnabilir. Verimlilik zerinde rol oynayabilecek dier etkenler sabit brakldnda, kullanlan programlama dilinin tasarmnn da verim zerinde etkili olduu sylenebilir. Bu adan bakldnda C verimli bir dildir.

Verimlilik

Baz diller zel bir uygulama alan iin tasarlanrlar. Sistem programlama Yapay zeka uygulamalar, simlasyon uygulamalar, veritaban sorgulamalar, oyun programlarnn yazm amacyla tasarlanan ve kullanlan programlama dilleri vardr. Baz diller ise daha geni bir kullanm alanna sahiptir. rnein veritaban sorgulamalarnda kullanlmak zere tasarlanan bir dil mhendislik uygulamalarnda da kullanlabilir. C dili de bir sistem programlama dili olarak domasna karn, gl yapsndan dolay ksa bir sre iinde genel amal bir dil haline gelmitir. Oysa PASCAL, BASIC ok daha genel amal dillerdir. C ana uygulama alan "sistem programcl" olan bir dildir. Ancak neredeyse tm uygulama alanlar iin C dilinde programlar yazlmtr.

Kullanm Alan

Uygulama Alanlarna Gre Snflandrma

Programlama dillerini uygulama alanlarna gre de gruplayabiliriz:

1. Bilimsel ve mhendislik uygulama dilleri: Pascal, C, FORTRAN. C Programlama dili niversitelerdeki akademik almalarda da youn olarak kullanlr. 2. Veri taban dilleri: XBASE, (Foxpro, Dbase, CA-Clipper), Oracle Forms, Visual Foxpro. 3. Genel amal programlama dilleri: Pascal, C, Basic. 4. Yapay zeka dilleri: Prolog, Lisp . 5. Simlasyon dilleri GPSS, Simula 67 6. Makro Dilleri (Scripting languages) awk, Perl, Python, Tcl, JavaScript. 7. Sistem programlama dilleri: Simgesel makine dilleri, BCPL, C, C++, occam. Gnmzde sistem yazlmlarn neredeyse tamamnn C dili ile yazldn syleyebiliriz.

7/529

C ve Sistem Programclar Dernei - C Ders Notlar - Necati Ergin

rnek vermek gerekirse UNIX iletim sisteminin % 80'i C dili ile geri kalan ise simgesel makine dili ile yazlmtr. Bu iletim sistemi ilk olarak BELL Laboratuarlarnda oluturulmutur. Kaynak kodlar gizli tutulmam, bylece eitli kollardan gelitirilmesi mmkn olmutur. Daha sonra gelitirilen UNIX bazl iletim sistemi uygulamalarna deiik isimler verilmitir. C bilimsel ve mhendislik alanlarna kullanlabilen genel amal bir sistem programlama dilidir.

Bir btn olarak zlmesi zor olan problemlerin paralara ayrlmas ve bu paralarn ayr ayr zlmesinden sonra paralar arasndaki balantnn salanmas programlamada sk bavurulan bir yntemdir. Bir programlama dili buna olanak salayan aralara sahipse programlama dilinin alt programlama yetenei vardr denilebilir. Alt programlama yetenei bir programlama dilinin, program paralar halinde yazmay desteklemesi anlamna gelir. Alt programlama Yapsal Programlama Teknii'nin de ayrlmaz bir parasdr. Alt programlamann getirdii baz nemli faydalar vardr. Alt programlar kaynak kodun klmesini salar. ok yinelenen ilemlerin alt programlar kullanlarak yazlmas alabilir programn kodunu kltr. nk alt programlar yalnzca bir kere, alabilir kod iine yazlr. Program kodu alt programn olduu yere atlatlarak bu blgenin defalarca altrlmas salanabilir. Alt programlama alglamay kolaylatrr, okunabilirlii artrr, ayn zamanda kaynak kodun test edilmesini kolaylatrr, kaynak kodun daha kolay gncelletirilmesini salar. Alt programlamann en nemli faydalarndan biri de oluturulan alt programlarn birden fazla projede kullanlabilmesidir (reusability). C alt programlama yetenei yksek bir dildir. C'de alt programlara ilev (function) denir. levler C dilinin yap talardr.

Alt Programlama Yetenei

Her programlama dilini renmenin ve renilen programlama dilinde uygulama gelitirebilmenin zorluk derecesi ayn deildir. Genel olarak programlama dillerinin dzeyi ykseldike, bu programlama dilini renme ve bakalarna retme kolaylar. Bugn yaygn olarak kullanlan yksek dzeyli programl dillerinin bu derece tutulmasnn nemli bir nedeni de bu dillerin ok kolay renilebilmesidir. Ancak yksek dzeyli dilleri renerek yetkin bir beceri dzeyi kazanmakta da ou zaman baka zorluklar vardr. Byle diller ok sayda hazr arac barndrrlar. rnein yksek dzeyli bir programlama ortamnda, GUI'ye ilikin hazr bir men ubuunun zelliklerini deitirmeye ynelik onlarca seenek sunulmu olabilir. Bu durumda programc, her bir seenein anlamn renmek durumunda kalr. Yani baz durumlarda programlama dilinin seviyesinin ykselmesi programc asndan bir algsal kolaylk getirmekle birlikte, programcya zellikle hazr aralara ynelik bir renme yk getirir.

renme ve retme Kolayl

Programlamann tarihsel geliim sreci iinde, baz programlama teknikleri (paradigmalar) ortaya kmtr. Programlamann ilk dnemlerinde yazlan programlarn boyutlar ok kk olduundan, program yazarken zel bir teknik kullanmaya pek gerek kalmyordu. nk bir program tek bir programcnn her ynyle stesinden gelebilecei kadar kkt ve basitti. Bir programda deiiklik yapmann ya da bir programa ekleme yapmann ciddi bir maliyeti yoktu. Bilgisayar donanmndaki teknik gelimeler, insanlarn bilgisayar programlarndan beklentilerinin artmas, bilgisayar programlarn ounlukla grsel arayzler kullanmalar, program boyutlarnn giderek bymesine yol at. Programlarn bymesiyle birlikte, program yazmaya ynelik farkl teknikler, yntemler gelitirildi. Bu tekniklere rnek olarak, "prosedrel programlama", "modler programlama", "nesne tabanl programlama", "nesneye ynelmi programlama", "trden bamsz programlama" verilebilir. 8/529

Programlama Tekniklerine Verilen Destekler

C ve Sistem Programclar Dernei - C Ders Notlar - Necati Ergin

"Prosedrel programlama" ile "yapsal programlama" ou zaman ayn anlamda kullanlr. Yapsal programlama bir programlama tekniidir. Bugn artk hemen hemen btn programlama dilleri yapsal programlamay az ok destekleyecek ekilde tasarlanmaktadr. Yapsal programlama fikri 1960'l yllarda gelitirilmitir. Yapsal programlama teknii drt ana ilke zerine kuruludur: 1. Bl ve stesinden gel (divide and conquer) Tek bir btn olarak yazlmas zor olan programlar, daha kk ve stesinden daha kolay gelinebilecek paralara blnrler. Yani program, blnebilecek kk paralarna ayrlr (functional decomposition). Bu paralar alt program, ilev, prosedr, vs. olarak isimlendirilir. Alt programlamann salad faydalar daha nce aklanmt. 2. Veri gizleme (Data hiding) Yapsal programlama tekniinde, programn dier paralarndan ulalamayan, yalnzca belli bir bilinirlik alan olan, yani kodun yalnzca belli bir ksmnda kullanlacak deikenler tanmlanabilir. Bu tr deikenler genel olarak "yerel deikenler" (local variables) olarak isimlendirilirler. Deikenlerin bilinirlik alanlarnn kstlanabilmesi hata yapma riskini azaltt gibi, programlarn daha kolay deitirilebilmesini, program paralarnn baka programlarda tekrar kullanabilmesini de salar. Alt programlarn, daha geni ekliyle modllerin, bir ii nasl yapt bilgisi, o alt programn ya da modln kullancsndan gizlenir. Kullanc (client) iin alt programn ya da modln ii nasl yapt deil, ne i yapt nemlidir. 3. Tek giri ve tek k (single entry single exit) Yapsal programlama tekniini destekleyen dillerde her bir altprogram parasna girmek iin tek bir giri ve tek bir k mekanizmas vardr. Bu ara programn yukardan aa olarak ak ile uyum halindedir. Program paralarna ancak tek bir noktadan girilebilir. 4. Dngler, dier kontrol yaplar Yapsal programlama tekniinde dngler ve dier kontrol deyimleri sklkla kullanlr. Artk kullanmda olan hemen hemen btn programlama dilleri az ya da ok yapsal programlama tekniini destekler. Nesneye ynelimli programlama Nesneye ynelimlilik (object orientation) de bir programlama tekniidir. Yapsal programlama teknii 1960l yllarda gndeme gelmiken, nesneye ynelimli programlama teknii 1980'li yllarda yaygnlamtr. Bu teknik, kaynak kodlarn ok bymesi sonucunda ortaya kan gereksinim yznden gelitirilmitir. C dilinin tasarland yllarda, akla gelebilecek en byk programlarn bile kaynak kodlar ancak birka bin satrd. Bilgisayar donanmndaki gelimeler, kullanclarn bilgisayar programlarndan beklentilerinin artmas ve grafik arayznn etkin olarak kullanlmasyla, bilgisayar programlarnn boyutu ok byd. Kullanmda olan birok programn bykl yzbin satrlarla hatta milyon satrlarla llmektedir. Nesneye ynelmi programlama teknii, hereyden nce byk programlarn daha iyi yazlmas iin tasarlanm bir tekniktir. C dilinin yaratld yllarda byle bir tekniin ortaya kmas sz konusu deildi, nk programlar bugnk llere gre zaten ok kkt. Nesneye ynelmi programlama tekniinde, programa ilikin veri ile bu veriyi ileyen kod, nesne isimli bir birim altnda birletirilir. Yani bu tekniin yap talar nesnelerdir. Bu tekniin prosedrel programlamada en nemli fark, programcnn programlama dilinin dzleminde deil de dorudan problemin kendi dzleminde dnmesi, program kurgulamasdr. Bu da gerek hayata ilikin bir problemin yazlmda ok daha iyi modellenmesini salar. Nesne ynelimli programlama tekniinin yaygn olarak kullanlmaya balanmasyla birlikte birok programlama dilinin bnyesine bu tekniin uygulanmasn kolaylatrc aralar eklenerek, yeni srmleri oluturulmutur. rnein C++ dili, C diline nesne ynelimli programlama tekniini uygulayabilmek iin baz eklemelerin yaplmasyla gelitirilmitir.

9/529

C ve Sistem Programclar Dernei - C Ders Notlar - Necati Ergin

Benzer amala Pascal diline eklemeler yaplarak Delphi dili, Cobol dilinin yenilenmesiyle Oocobol, ada dilinin yenilenmesiyle ise ada 95 dilleri gelitirilmitir. Baz programlama dilleri ise dorudan nesneye ynelmi programlama tekniini destekleyecek ekilde tasarlanarak gelitirilmitir. Byle dillere saf nesne ynelimli diller de denir. rnein Java, Eiffel, C#, saf nesne ynelimli dillerdir. zetle, bir programlama dili hakknda sorulacak sorulardan belki de en nemlilerinden biri, o programlama dilinin belirli bir programlama tekniini destekleyen aralara sahip olup olmaddr. C dili, var olan aralaryla prosedrel programlama tekniine tam destek veren bir dildir.

Sral, indeksli ve rastgele dosyalara erime, veritaban kaytlarn geri alma, gncelletirme ve sorgulama yeteneidir. Veritaban programlama dillerinin (DBASE, PARADOX vs.) bu yetenekleri, dierlerinden daha stndr. Bu dillerin en tipik zelliklerini oluturur. Fakat C giri k kolayl gl olmayan bir dildir. C'de veri tabanlarnn ynetimi iin zel ktphanelerin kullanlmas gerekir.

Giri / k Kolayl

ncelenen kstaslardan sonra C dili belirli bir yere oturtulabilir: C orta seviyeli bir programlama dilidir. Dier yapsal programlama dillerine gre C dilinin seviyesi daha dktr. C dili hem yksek seviyeli dillerin kontrol deyimleri, veri yaplar gibi avantajlarna sahipken hem de bitsel ileler gibi makine kodu deyimlerini yanstan ilelere sahiptir. Yani C dili hem makinenin algsna hem de insann alglamasna yakn bir dildir. C makineye yeterince yakndr ama programcya da uzak deildir. Tercih edilmesinin ana nedenlerinden biri budur. Bir program C dili kullanarak yazmak, ayn program makine dilinde yazmaya gre ok daha kolay olmasna karn, C'de yazlm bir programn verimi ayn oranda dmez. C dili verim asndan bakldnda birok uygulama iin, dorudan makine diline tercih edilebilir. Makina dili yerine C dilinde programlama yaplmas oluturulan programn verimini ok drmez. C dilinin ana uygulama alan "Sistem programlama" dr. Sistem programlama ne demektir? Donanmn ynetilmesi, ynlendirilmesi ve denetimi iin yazlan, dorudan makinenin donanmla ilikiye giren programlara sistem program denir. rnein, iletim sistemleri, derleyiciler, yorumlayclar, aygt srcleri (device drivers), bilgisayarlarn iletiimine ilikin programlar, otomasyon programlar, sistem programlardr. C'den nce sistem programlar assembly dillerle yazlyordu. Gnmzde sistem programlarnn yazlmasnda C dilinin neredeyse tek seenek olduu sylenebilir. Bugn cep telefonlarndan uaklara kadar her yerde C kodlar alyor. C algoritmik bir dildir. C dilinde program yazmak iin yalnzca dilin szdizimini ve anlamsal yapsn bilmek yetmez genel bir algoritma bilgisi de gerekir. C dier dillerle kyaslandnda tanabilirlii ok yksek olan bir dildir. nk 1989 ylndan bu yana genel kabul grm standartlara sahiptir. C ifade gc yksek, okunabilirlik zellii gl bir dildir. C dilinde yazlan bir metnin okunabilirliinin yksek olmas szel bir dil olmasndan, insann kulland dile yakn bir dil olmasndan deildir. C ok esnek bir dildir. Dier dillerde olduu gibi programcya kstlamalar getirmez. Makinann olanaklarn programcya daha iyi yanstr. C gl bir dildir, ok iyi bir biimde tasarlanmtr. C'ye ilikin ilelerin ve yaplarn bir ou daha sonra baka programlama dilleri tarafndan da benimsenmitir. C verimli bir dildir. C de yazlan programlar dilin dzeyinin dk olmas nedeniyle hzl alr. Verimlilik konusunda assembly diller ile rekabet edebilir. C doal bir dildir. C bilgisayar sistemi ile uyum iindedir. C kk bir dildir. Yeni sistemler iin derleyici yazmak zor deildir. C nin standart bir ktphanesi vardr. Bu ktphane ile sk yaplan ilemler iin ortak bir arayz salanmtr. C'nin eitimi dier bilgisayar dillerine gre daha zordur.

C Nasl Bir Programlama Dilidir

10/529

C ve Sistem Programclar Dernei - C Ders Notlar - Necati Ergin

C dili UNIX iletim sistemi ile btnleme iindedir. UNIX iletim sisteminde kullanlan baz aralar kullancnn C dilini bildiini varsayar. Dier tm bilgisayar programlama dillerinde olduu gibi C dilinin de zayf taraflar vardr. Esnek ve gl bir dil olmas programcnn hata yapma riskini artrr. C dilinde yazlan kodlarda yaplan yanllklarn bulunmas dier dillere gre daha zor olabilir.

C dilinin UNIX iletim sisteminin bir yan rn olarak doduu sylenebilir. nce Unix iletim sisteminin tarihine deinelim: 1965 ylnda MITde MAC isimli bir proje gerekletirildi. MAC bir bilgisayar sisteminin zaman paylamn salayan ilk projelerden biriydi. Bu proje ile ayn bilgisayar 30 a kadar kullanc tarafndan paylalabiliyordu 160 ayr yazcy kullanmak da mmknd. Bu projenin baarsndan cesaret alan MIT, General Electric ve Bell Laboratuarlar ile bir ortak giriim oluturararak zaman paylaml yeni bir sistem oluturma almasna balad. Bu projeye MULTICS (Multiplexed Information and Computing Service) ismi verildi. Bell Laboratuarlar projenin yazlm ksmndan sorumluydu. 1969 ylnda Bell Laboratuarlar proje sresinin uzamas ve proje maliyetinin yksek olmas nedeniyle projeden ayrld. 1969 ylnda Bell Laboratuarlarnda Ken Thompson nclnde bir grup yeni bir alternatif arayna girdi. MULTICS projesinde alan Ken Thompson ve ekip arkada Dennis Ritchie bu konuda bir hayli deneyim kazanmt. Thompson ve ekibi, insan ve makine arasndaki iletiimi kolaylatracak bir iletim sistemi tasarmna giriti. letim sisteminin omurgas yazldnda MULTICS'e gnderme yaplarak iletim sistemine Unix ismi verildi. Bu yllarda programclar PL/1, BCPL gibi yksek seviyeli dilleri kullanyorlard. Thompson DEC firmasnn ana bellei yalnzca 8K olan PDP 7 isimli bilgisayar zerinde alyordu. Thompson 1960 l yllarda Martin Richards tarafndan gelitirilen BCPL dilini kullanmakta deneyimliydi. Kendi dilini tasarlarken Thompson, 1960 yllarnn ortalarnda Martin Richards tarafndan gelitirilmi BCPL dilinden yola kt. (BCPL = Business Common Programming Language). Bu dil de CPL = Cambridge Programming Language'den tretilmitir. CPL'in kayna da tm zamanlarn en eski ve en etkili dillerinden biri olan ALGOL 60'dr. ALGOL 60, Pascal, ADA, Modula2 dillerinin de atasdr. Bu dillere bu yzden C dilinin kuzenleri de diyebiliriz. Aada ALGOL 60 dil ailesi grlyor:

C Programlama Dilinin Tarihi

11/529

C ve Sistem Programclar Dernei - C Ders Notlar - Necati Ergin

Thompson gelitirdii bu dilin ismini B koydu. Dennis Ritchie, UNIX projesine katlnca B dilinde programlamaya balad. B dili daha da gelitirilmiti ve artk daha yeni bir teknoloji olan Dec PDP-11 bilgisayarlarda alyordu. Thompson, UNIX iletim sisteminin bir ksmn B dilinde yeniden yazd. 1971 ylna gelindiinde B dilinin PDP-11 bilgisayarlar ve UNIX iletim sisteminin gelitirilmesi iin ok uygun olmad iyice ortaya kt. Bu yzden Ritchie, B programlama dilinin daha ileri bir srmn gelitirmeye balad. Oluturduu dili ilk nce NB (new B) olarak isimlendirdi. Ama gelitirdii dil B dilinden iyice kopmaya ve ayr bir karakter gstermeye balaynca dilin ismini de C olarak deitirdi. 1973 ylnda UNIX iletim sisteminin byk bir ksm C dili ile yeniden yazld. Ken Thompson ve Dennis Ritchie Unix letim Sistemi zerinde alrken (Yl: 1972) C'nin evrimi ve gelimesi 70'li yllarda da srd. Ancak uzun bir sre C dili dar bir evrede kullanld. Geni kitleler tarafndan tannmas ve kullanlmaya balamas 1978 ylnda Dennis Ritchie ve Brian Kernighan tarafndan yazlan "The C Programming Language" kitab ile olmutur. Bu kitap ayn zamanda yazlm konusunda yazlan en iyi eserlerden biri olarak deerlendirilmektedir. C standartlarnn oluturulmasna kadar olan dnemde bu kitap ounluun benimsedii genel kabul gren gayri resmi (de facto) bir standart grevi de grmtr. Bu kitap ksaca K&R (Kernighan & Ritchie) olarak isimlendirilmektedir. 1970'li yllarda C programclarnn says azd ve bunlardan ou UNIX kullanclaryd. Ama artk 80'li yllar gelince C'nin kullanm UNIX snrlarn at, farkl iletim sistemleri iin alan derleyiciler piyasaya kt. C dili de IBM PC'lerde youn olarak kullanlmaya balad. C'nin hzl bir biimde yaygnlamas baz sorunlar da beraberinde getirdi. Derleyici yazan firmalar, referans olarak Ritchie ve Kernighan'n kitabn esas alyorlard ama sz konusu kitapta baz noktalar ok da ayrntl bir biimde aklanmamt. zellikle hangi noktalarn C dilinin bir zellii hangi noktalarn ise UNIX iletim sisteminin bir zellii olduu o kadar ak olmad iin bir takm karklklar ortaya kyordu. Bylece derleyici yazanlarn rnlerinde de farkllklar ortaya kyordu. Ayrca kitabn yaynlanmasndan sonra da dilde bir takm gelitirmeler, iyiletirmeler, deiiklikler yapld iin, birbirinden ok farkl derleyiciler piyasada kullanlmaya balanmt.

Hangi C

C tek bir programlama dili olmasna karn C'nin farkl srmlerinden sz etmek olasdr:

C dili ilk olarak 1978 ylnda yaymlanan Dennis Ritchie ve Brian Kernighan tarafndan yazlm "The C Programming Language" isimli kitapta anlatlmt. 1980'li yllarda C dili bu kitapta anlatlan genel geer kurallara gre kullanld, derleyici yazan firmalar bu kurallar esas aldlar. Bu dnem iinde kullanlan derleyiciler arasnda baz kural ve yorum farkllklar olsa da ana kurallar zerinde bir genel bir uzlama olduu sylenebilir. C dilinin standartlatrlmas srecine kadar kullanlan bu srme "Geleneksel C (Traditional

Geleneksel C

12/529

C ve Sistem Programclar Dernei - C Ders Notlar - Necati Ergin

C)" ya da "Klasik C (Classic C)" denmektedir. phesiz C dilinin bu dneminde derleyici yazan firmalar uzlalm kurallarn dnda kendi zel eklentilerini de dile katmaktaydlar.

C dilinin standart hale getirilmesinin dilin ticari kullanmnn yaygnlamasna yardmc olacan dnen Amerikan Ulusal Standartlar Enstits (ANSI) C dili ve ktphanesi iin bir standart oluturmas amacyla 1982 ylnda bir komite oluturdu. Jim Brody bakanlnda alan ve X3J11 numarasyla anlan bu komitenin oluturduu standartlar 1989 ylnda kabul edilerek onayland. Bu standardn resmi ismi American National Standard X3.159-1989 olmakla birlikte ksaca ANSI C diye anlmaktadr. ANSI C almas tamamlandnda bu kez uluslararas bir standart oluturmak amacyla P.J.Plaguer bakanlnda oluturulan bir grup (ISO/IEC JTC1/SC22/WG14) ANSI standartlarn uluslararas bir standarda dntrd. Baz kk biimsel deiiklikler yaplarak oluturulan bu standardn resmi ismi ISO/IEC 9899:1990' dr. Bu standart daha sonra ANSI tarafndan da kabul edilmitir. Ortak kabul gren bu standarda Standard C (1989) ya da ksaca C89 denmektedir. Geleneksel C' den C89' a geite nemli deiiklikler olmutur.

Standart C (1989)

1995 ylnda Wg14 komitesi C89 standartlar zerinde iki teknik dzeltme ve bir eklenti yaymlad. Bu dzeltme notlar ve eklentiler ok nemli deiiklikler olarak grlmemektedir. Bu dzeltmelerle deitirilmi standartlara "C89 with amendment 1" ya da ksaca C95 denmektedir

Standart C (1995)

ISO/IEC standartlar belirli aralklarla gzden geirilmekte, gncellenmektedir. 1995 ylnda Wg14 kurulu C standartlar zerinde kapsaml deiiklikler ve eklentiler yapmak zere bir alma balatt. alma 1999 ylnda tamamland. Oluturulan yeni standardn resmi ismi ISO/IEC 9899:1999'dur. Ksaca C99 olarak anlmaktadr. Bu standart resmi olarak daha nceki tm srmlerin yerine gemitir. Derleyici yazan firmalar derleyicilerini yava yava da olsa bu standarda uygun hale getirmektedirler. C99 standartlar C89/C95'e birok eklenti salamtr. Bunlardan bazlar Sanal saylarn doal tr olarak eklenmesi Daha byk bir tamsay trnn eklenmesi Deiken uzunlukta diziler Boolean (Mantksal) veri tr ngilizce olmayan karakter setleri iin daha kapsaml destek Gerek say trleri iin daha iyi destek C++ tarz aklama satrlar satr ii (inline) ilevler

Standart C (1999)

C99 ile getirilen deiiklikler ve eklentiler C95'e gre daha fazla ve nemlidir. Ancak C dilinin doal yaps deitirilmemitir.

C++ Dili

C++ dili de 1980 li yllarn balarnda Bjarne Stroustrup tarafndan AT&T Bell Laboratuarlar'nda gelitirildi. C++ dili C'den ayr, tamamyla baka bir programlama dilidir. Dilin tasarmcs Bjarne Stroustoup, C'nin orta seviyeli zelliklerine baz eklemeler yaparak, bata nesne ynelimli programlama teknii olmak zere baka programlama tekniklerini de destekleyen ayr bir dil oluturdu. C++ dili de dinamik bir gelime sreci sonunda 1998 ylnda standart haline getirildi. Oluturulan resmi standardn ismi ISO/IEC 14882:1998'dir. C++ birden fazla programlama tekniini destekleyen (multi-paradigm) bir dildir. Temel szdizimi byk lde C dilinden alnmtr. Ancak szdizim zellikleri birbirine benzese

13/529

C ve Sistem Programclar Dernei - C Ders Notlar - Necati Ergin

de dilin aralarnn kullanlma biimi C'den olduka farkldr. C++, C ile karlatrldnda ok daha byk ve karmak bir dildir. C++, C dilini de kapsayan bir st dil olarak dnlebilir. Eer baz noktalara dikkat edilirse hem C dilinde hem de C++ dilinde geerli olabilecek programlar yazlabilir. C dilinin byle kullanmna "clean C" ("Temiz C") denmektedir.

Hangi C'yi Kullanmal

Bu karar verilirken, uygulamann gelitirilecei alan iin nasl bir C derleyicisinin olduu phesiz nemlidir. Karar verilmesinde bir dier etken de yazlan kodun ne seviyede tanabilir olmasnn istendiidir. Seeneklerin aadakiler olduu dnlebilir: 1. C99. C dilinin son srm. C dilinin tm zelliklerini iermektedir. Ancak baz derleyiciler bu srm henz desteklememektedir. 2. C89. En fazla kullanlan srmdr. Bu srm kullanldnda genellikle C95 eklentileri de kullanlmaktadr. 3. Geleneksel C. Yeni programlarn yazlmasnda artk kullanlmasa da, eskiden yazlan programlarn bakmnda kullanmak gerekebilir. 4. Temiz C (Clean C). Yani C dilinin ayn zamanda C++ diline uyumlu olarak kullanlmas. C99 srm, C89 ve Klasik C ile genel olarak yukarya doru uyumludur. Yani Klasik C programlar ve C89 programlar, C99 dilinin kurallarna gre derlendiinde ya deiiklik yapmak gerekmez ya da ok az deiiklik yapmak gerekir. Bu deiiklikler iin nilemci program (preprocessor) kullanlabilir. Gemie doru uyumlu program yazmaksa ou zaman mmkn deildir.

Objective C - Concurrent C

C dilinin kullanm yaygnlatktan sonra C dilinden baka diller de tretilmitir: Objective C dili, NeXT firmas tarafndan OpenStep iletim sistemi iin uyarlanmtr. NeXT firmas daha sonra Apple firmas tarafndan satn alnmtr. Objective C dilinin Apple firmasnn yeni kuak iletim sistemi olan Rhapasody iin temel gelitirme arac olmas planlanmaktadr. "Concurrent C" dili, Bell Laboratuarlarndan Dr. Narain Gehani ve Dr. William D.Roome tarafndan gelitirilmitir. Daha ok, paralel programlamada kullanlmaktadr.

14/529

C ve Sistem Programclar Dernei - C Ders Notlar - Necati Ergin

SAYI SSTEMLERGnlk hayatta onluk say sistemi kullanlr. Onluk say sisteminde bir saynn deeri aslnda her bir basamak deerinin 10 saysnn sleriyle arpmlarndan elde edilen toplam deeridir. rnein: 1273 = (3 * 1) + (7 * 10 ) + (2 * 100) + (1 * 1000) Ancak bilgisayar sistemlerinde btn bilgiler ikilik say sisteminde (binary system) ifade edilir. Genel olarak say sistemi kalksa o say sisteminde o kadar simge bulunur. rnein onluk say sisteminde 10 adet simge vardr: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 Ayn ekilde ikilik say sisteminde yalnzca iki adet simge bulunur. Yani yalnzca 0 ve 1.

kilik sistemde her bir basamaa (digit) 1 bit denir. Bit kelimesi binary digit szcklerinden tretilmitir. rnein 1011 says 4 bittir yani 4 bit uzunluundadr. 11011001 says 8 bittir. 8 bitlik bir byklk bir byte olarak isimlendirilir. Kilo, byklk olarak 1000 kat anlamna gelir. Ancak bilgisayar alannda Kilo, 2'nin 1000'e en yakn ss olan 210 yani 1024 kat olarak kullanlr. Aada daha byk birimlerin listesi veriliyor: 1 1 1 1 1 1 1 1 kilobyte megabyte gigabyte terabyte petabyte exabyte zettabyte yottabyte 1 1 1 1 1 1 1 1 KB MB GB TB PB EB ZB YB 1024 1024 1024 1024 1024 1024 1024 1024 byte KB MB GB TB PB EB ZB 210 220 230 240 250 260 270 280 byte byte byte byte byte byte byte byte

Birimler

zellikle sistem programclnda daha kk birimlere de isim verilir: 4 bit 8 bit 16 bit 32 bit 64 bit 1 1 1 1 1 Nybble byte word double word quadro word

Tamsay deerlerini gstermek iin ikilik say sistemi iki farkl biimde kullanlabilir. Eer yalnzca sfr ve pozitif tamsaylar gsteriliyorsa, bu biimde kullanlan ikilik say sistemine iaretsiz (unsigned) ikilik say sistemi denir. kilik say sisteminin negatif tamsaylar da gsterecek biimde kullanlmasna, iaretli (signed) ikilik say sistemi denir.

kilik Say Sistemine likin Genel lemler

kilik say sisteminde ifade edilen bir saynn onluk say sistemindeki karln hesaplamak iin en sadan balanarak btn basamaklar tek tek ikinin artan sleriyle arplr. rnein:

kilik Say Sisteminden Onluk Say Sistemine Dnm

15/529

C ve Sistem Programclar Dernei - C Ders Notlar - Necati Ergin

1 0 1 1 = 1 * 20 + 1 * 21 + 0 * 22 + 1 * 23 = 11 0010 1001 = (1 * 1) + (1 * 8) + (1 * 32) = 41

MSD ve LSD

kilik say sisteminde yazlan bir saynn en solundaki bit, yukardaki rnekten de grld gibi en yksek saysal deeri katar. Bu bite en yksek anlaml bit (most significant digit) denir. Bu bit iin ounlukla "MSD" ksaltmas kullanlr. kilik say sisteminde yazlan bir saynn en sandaki bit, yine yukardaki rnekten de grld gibi en dk saysal deeri katar. Bu bite en dk anlaml bit (least significant digit) denir. Bu bit iin ounlukla LSD ksaltmas kullanlr. rnek: 0101 1101 says iin MSD = 0 LSD = 1 kilik say sisteminde yazlan bir saynn belirli bir bitinden sz edildiinde, hangi bitten sz edildiinin doru bir ekilde anlalmas iin basamaklar numaralandrlr. 8 bitlik bir say iin, saynn en sandaki bit yani (LSD) saynn 0. bitidir. Saynn en solundaki bit (yani MSD) saynn 7. bitidir.

Onluk Say Sisteminden kilik Say Sistemine Dnm

Say srekli olarak ikiye blnr. Her blmden kalan deer (yani 1 ya da 0) oluturulacak saynn sfrnc bitinden balanarak, basamaklarn oluturur. Bu ilem 0 deeri elde edilinceye kadar srdrlr. rnek olarak 87 says ikilik say sisteminde ifade edilmek istensin: 87 / 2 = 43 (kalan 1) Saynn 0. biti 1 43 / 2 = 21 (kalan 1) Saynn 1. biti 1 21 / 2 = 10 (kalan 1) Saynn 2. biti 1 10 / 2 = 5 (kalan 0) Saynn 3. biti 0 5 / 2 = 2 (kalan 1) Saynn 4. biti 1 2 / 2 = 1 (kalan 0) Saynn 5. biti 0 1 / 2 = 0 (kalan 1) Saynn 6. biti 1 87 = 0101 0111 kinci bir yntem ise, onluk say sisteminde ifade edilen saydan srekli olarak ikinin en byk ssn karmaktr. karlan her bir s iin ilgili basamaa 1 deeri yazlr. Bu ilem 0 says elde edilene kadar srdrlr. Yine 87 says ikilik say sisteminde ifade edilmek istensin: 87 - 64 23 - 16 7 - 4 3 - 2 1 - 1 = = = = = 23 7 3 1 0 0100 0101 0101 0101 0101 0000 0000 0100 0110 0111

87 = 0101 0111

Bire tmleyen (one's complement) saynn tm bitlerinin tersinin alnmasyla elde edilen saydr. Yani bire tmleyen, saydaki 1 bitlerinin 0, 0 bitlerinin 1 yaplmasyla elde edilir. Bir saynn bire tmleyeninin bire tmleyeni saynn yine kendisidir.

Bire Tmleyen

kiye Tmleyen

Bir saynn bire tmleyeninin 1 fazlas saynn ikiye tmleyenidir (two's complement).

16/529

C ve Sistem Programclar Dernei - C Ders Notlar - Necati Ergin

Yani nce saynn bire tmleyeni yukardaki gibi bulunur. Daha sonra elde edilen sayya 1 eklenirse saynn ikiye tmleyeni bulunmu olur. kiye tmleyeni bulmak iin daha ksa bir yol daha vardr: Saynn en sandan balayarak ilk kez 1 biti grene kadar -ilk grlen 1 biti dahilsaynn ayns yazlr, daha sonraki tm basamaklar iin basaman tersi (Yani 1 iin 0, 0 iin 1) yazlr. rnein: 1110 0100 saysnn ikiye tmleyeni 0101 1000 saysnn ikiye tmleyeni 0001 1100 dr. 1010 1000 dr.

Bir saynn ikiye tmleyeninin ikiye tmleyeni saynn kendisidir.

8 Bitlik Alana Yazlabilen En Kk ve En Byk Deer8 bitlik bir alana yazlacak en byk tam say tm bitleri 1 olan saydr: 1111 1111 = 255 8 bitlik bir alana yazlacak en kk tam say tm bitleri 0 olan say, yani 0'dr: 0000 0000 = 0

Negatif tamsaylarn da ifade edildii ikilik say sistemine "iaretli ikilik say sistemi" (signed binary system) denir. aretli ikilik say sisteminde negatif deerleri gstermek iin hemen hemen tm bilgisayar sistemlerinde aadaki yntem uygulanr: Saynn en soldaki biti iaret biti (sign bit) olarak kabul edilir. aret biti 1 ise say negatif, 0 ise say pozitif olarak deerlendirilir. kilik sistemde bir negatif say, ayn deerdeki pozitif saynn ikiye tmleyenidir. rnek olarak, ikilik sistemde yazlan 27 says yine ikilik sistemde yazlan 27 saysnn ikiye tmleyenidir. Pozitif olan saylarn deeri, tpk iaretsiz say sisteminde olduu gibi elde edilir: rnein, 0001 1110 iaretli ikilik say sisteminde pozitif bir saydr. Onluk say sisteminde 30 saysna eittir. Negatif tamsaylarn deeri ancak bir dnmle elde edilebilir. Saynn deerini hesaplamak iin ilk nce saynn ikiye tmleyeni bulunur. Bu saynn hangi pozitif deer olduu bulunur. Elde edilmek istenen say, bulunan pozitif say ile ayn deerdeki negatif saydr. rnein, 1001 1101 saysnn onluk say sisteminde hangi sayya karlk geldiini bulalm: aret biti 1 olduuna gre say negatiftir. 1001 1101 saysnn ikiye tmleyeni 0110 0011, yani 99 deeridir. O zaman 1001 1101 says -99'dur. Onluk say sisteminde ifade edilen negatif saylarn iaretli ikilik say sisteminde yazlmas iin aadaki yol izlenebilir: nce saynn ayn deerli fakat pozitif olan ikilik sistemde ifade edilir. Daha sonra yazlan saynn ikiye tmleyeni alnarak, yazmak istenilen say elde edilir. rnein, ikilik sisteminde 17 deerini yazalm: 17 = 0001 0001 Bu saynn ikiye tmleyeni alnrsa 1110 1111

Negatif Saylarn Gsterimi

17/529

C ve Sistem Programclar Dernei - C Ders Notlar - Necati Ergin

says elde edilir. Say deeri ayn olan negatif ve pozitif saylar birbirinin ikiye tmleyenidir. Bu saylarn ikilik say sisteminde toplamlar 0'dr. aretli ikilik say sisteminde 1 byte'lk alana yazlabilecek en byk ve en kk saylar ne olabilir? En byk say kolayca hesaplanabilir. Saynn pozitif olmas iin, iaret bitinin 0 olmas ve say deerini en byk hale getirmek iin dier btn bitlerinin 1 olmas gerekir, deil mi? Bu say 0111 1111'dr. Bu saynn onluk say sistemindeki karl 127'dir. Peki ya en kk negatif say katr, nasl ifade edilir? 0111 1111 saysnn ikiye tmleyenini alndnda 127 says elde edilir. 1000 0001 (- 127) Bu saydan hala 1 kartlabilir: 1000 0000 (-128) 1000 0000, 1 byte alana yazlabilecek en kk negatif saydr. 1 byte alana yazlabilecek en byk say snr aldnda negatif blgeye geilir. En byk pozitif tamsayya 1 toplandn dnelim: 0111 1111 1 1000 0000 (en byk pozitif tamsay = 127) (en kk tamsay = -128)

aretli ikilik sistemde n byte alana yazlabilecek en byk tamsayya 1 eklendiinde n byte alana yazlabilecek en kk tamsay elde edilir. n byte alana yazlabilecek en kk tamsaydan 1 karldnda da n byte alana yazlabilecek en byk tamsay elde edilir. Yukarda aklamalara gre -1 saysnn iaretli ikilik say sisteminde 8 bitlik bir alanda aadaki ekilde ifade edilir: -1 = 1111 1111 Yani iaretli ikilik say sisteminde tm bitleri 1 olan say -1'dir.

18/529

C ve Sistem Programclar Dernei - C Ders Notlar - Necati Ergin

Onaltlk ve Sekizlik Say Sistemleri

Onaltlk say sisteminde (hexadecimal system) saylar daha youn olarak kodlanp kullanabilir.Onaltlk say sisteminde 16 simge bulunur. lk 10 simge onluk sistemde kullanlanlarla ayndr: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 Daha sonraki simgeler iin alfabenin ilk 6 harfi kullanlr: A = 10, B = 11, C = 12, D = 13, E = 14, F = 15 Onaltlk say sisteminde yazlm bir sayy onluk sistemde ifade etmek iin, en sadan balanarak basamak deerleri onaltnn artan sleriyle arplr: 01AF = (15 * 1) + (10 * 16) + (1 * 256) + (0 * 4096) = 431

Onluk say sisteminde yazlm bir sayy, onaltlk say sisteminde ifade etmek iin onluk say sisteminden ikilik say sistemine yaplan dnme benzer yntem kullanlabilir. Say srekli 16'ya blnerek, kalanlar soldan saa doru yazlr. Uygulamalarda onaltlk say sisteminin getirdii nemli bir fayda vardr: Onaltlk say sistemi ile ikilik say sistemi arasndaki dnmler kolay bir biimde yaplabilir: Onaltlk say sistemindeki her bir basamak ikilik say sisteminde 4 bitlik (1 Nibble) alanda ifade edilebilir: 0000 0001 0010 0011 0100 0101 0110 0111 0 1 2 3 4 5 6 7 1000 1001 1010 1011 1100 1101 1110 1111 8 9 A B C D E F

rnek olarak, 2ADF saysn ikilik say sisteminde ifade edilmek istensin: 2 A D F = = = = 0010 1010 1101 1111

Bu durumda 2ADF = 0010 1010 1101 1111 kilik say sisteminden onaltlk say sistemine de benzer ekilde dnm yaplabilir: nce bitler sadan balayarak drder drder ayrlr. En son drt bit eksik kalrsa sfr ile tamamlanr. Sonra her bir drtlk grup iin dorudan onaltlk say sistemindeki karl yazlr: 1010 1110 1011 0001 = AEB1 0010 1101 0011 1110 = 2D3E Onaltlk say sisteminde yazlm iaretli bir saynn pozitif mi negatif mi olduunu anlamak iin saynn en soldaki basamana bakmak yeterlidir. Bu basamak [8 - F] aralnda ise say negatiftir.

19/529

C ve Sistem Programclar Dernei - C Ders Notlar - Necati Ergin

Aada baz nemli iaretli tamsaylar, ikilik, onaltlk say sistemlerinde ifade ediliyor: kilik say sistemi 0000 0000 0000 0000 0000 0000 0000 0001 0111 1111 1111 1111 1000 0000 0000 0000 1111 1111 1111 1111 onaltlk say sistemi 0000 0001 7FFF 8000 FFFF onluk say sistemi 0 1 32767 -32768 -1

Daha az kullanlan bir say sistemidir. Sekizlik say sisteminde 8 adet simge vardr: 0 1 2 3 4 5 6 7 Sekizlik say sisteminin her bir basama, ikilik say sisteminde 3 bit ile ifade edilir. 001 010 011 100 101 110 111 1 2 3 4 5 6 7

Sekizlik Say Sistemi

Sekizlik say sisteminin kullanlma nedeni de, ikilik say sistemine gre daha youn bir ifade biimine olanak vermesi, ikilik say sistemiyle sekizlik say sistemi arasnda dnmlerin ok kolay bir biimde yaplabilmesidir.

20/529

C ve Sistem Programclar Dernei - C Ders Notlar - Necati Ergin

Bir gerek say aadaki gibi ifade edilebilir:

Gerek Saylarn Bellekte Tutulmasp

x= s * b * f k * b ke k =1Yukardaki genel denklemde x b e p fk ifade edilecek gerek say Kullanlan say sisteminin taban deeri (Tipik olarak 2, 8, 10 ya da 16) stel deer. Bu deer format tarafndan belirlenen emin ve emax arasndaki bir deer Ondalk ksm belirleyen basamak says Say sistemindeki basamak deerleri. 0 fk b

Gerek saylarn ifadesinde, gerek say kabul edilmeyen baz gsterimler sz konusudur. Bunlar: sonsuz (infinity) NaN (not a number) deerleridir. Bu deerler iaretli olabilir. Sistemlerin ounda, gerek saylar IEEE (Institute of Electrical and Electronics Engineers) 754 standardna gre tutulur. (IEEE Standard for Binary Floating-Point Arithmetic - ISO/IEEE std 754-1985).Bu standarda gre gerek saylar iin iki ayr format belirlenmitir: 1. Tek duyarlkl gerek say format (single precision format) Bu formatta gerek saynn gsterimi genel formle aadaki biimde uyarlanabilir:

x= s * 2 * f k * 2ke k =1Bu formatta gerek say 32 bit (4 byte) ile ifade edilir. 32 bit ayr ksma ayrlmtr. i. aret biti (sign bit) (1 bit) Aada S harfi ile gsterilmitir. aret biti 1 ise say negatif, iaret biti 0 ise say pozitiftir. ii. stel ksm (exponent) (8 bit) Aada E harfleriyle gsterilmitir. iii. Ondalk ksm (fraction) (23 bit) Aada F harfleriyle gsterilmitir. SEEEEEEEEFFFFFFFFFFFFFFFFFFFFFFF Aadaki formle gre saynn deeri hesaplanabilir : V, gerek saynn deeri olmak zere: EEEEEEEE = 255 ve FFF...F 0 ise V = NaN (Not a number)

24

21/529

C ve Sistem Programclar Dernei - C Ders Notlar - Necati Ergin

rnek : 0 11111111 00001000000100000000000 (Say deil) 1 11111111 00010101010001001010101 (Say deil) EEEEEEEE = 255 ve FFF...F = 0 ve S = 1 ise EEEEEEEE = 255 ve FFF...F = 0 ve S = 0 ise 0 < EEEEEEEE < 255 ise V = (-1)S * 2(E - 127) * (1.FFF...F) nce saynn ondalk ksmnn bana 1 eklenir. Daha sonra bu say 2(E - 127) ile arplarak noktann yeri ayarlanr. Noktadan sonraki ksm ikinin artan negatif sleriyle arplarak elde edilir. rnekler: 0 10000000 00000000000000000000000 = +1 * 2(128 = 2 * 1.0 = 10.00 = 2 0 10000001 10100000000000000000000 = +1 * 2(129 = 22 * 1.101 = 110.100000 = 6.5 1 10000001 10100000000000000000000 = -1 * 2(129 = -22 * 1.101 = 110.100000 = -6.5 0 00000001 00000000000000000000000 = +1 * 2(1 = 2-126 EEEEEEEE = 0 ve FFF...F 0 ise V = (-1)S * 2-126 * (0.FFF...F) rnekler : 0 00000000 10000000000000000000000 = +1 * 2-126 * 0.1 0 00000000 00000000000000000000001 = +1 * 2-126 * 0.00000000000000000000001 = 2-149 (en kk pozitif deer) EEEEEEEE = 0 ve FFF...F = 0 ve S = 1 ise V = -0 EEEEEEEE = 0 ve FFF...F = 0 ve S = 0 ise V = 0 2. ift duyarlkl gerek say format (double precision format) Bu formatta gerek saynn gsterimi genel formle aadaki biimde uyarlanabilir:- 127)

V = -sonsuz V = +sonsuz

* 1.0

- 127)

* 1.101

- 127)

* 1.101

- 127)

* 1.0

x= s * 2 * f k * 2 ke k =1Bu formatta gerek say 64 bit yani 8 byte ile ifade edilir. 64 bit ayr ksma ayrlmtr.

53

22/529

C ve Sistem Programclar Dernei - C Ders Notlar - Necati Ergin

i. aret biti (sign bit) (1 bit) Aada S harfi ile gsterilmitir. aret biti 1 ise say negatif, iaret biti 0 ise say pozitiftir. ii. stel ksm (exponent) (11 bit) Aada E harfleriyle gsterilmitir. iii. Ondalk ksm (fraction) (52 bit) Aada F harfleriyle gsterilmitir. SEEEEEEEEEEEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF Aadaki formle gre saynn deeri hesaplanabilir, V saynn deeri olmak zere: EEEEEEEEEEE = 2047 ve FFF...F 0 ise V = NaN (Not a number) EEEEEEEEEEE = 2047 ve FFF...F = 0 ve S = 1 ise V = -sonsuz EEEEEEEEEEE = 2047 ve FFF...F = 0 ve S = 0 ise V = +sonsuz 0 < EEEEEEEEEEE < 2047 ise V = (-1)S * 2(EEEEEEEEEEE- 1023)

* (1.FFF...F)

nce saynn ondalk ksmnn bana 1 eklenir. Daha sonra bu say 2(EEEEEEEEEEE-123) ile arplarak noktann yeri ayarlanr. Noktadan sonraki ksm, ikinin artan negatif sleriyle arplarak elde edilir. EEEEEEEEEEE = 0 ve FFF...F 0 ise V = (-1)S * 2-126 * (0. FFF...F) EEEEEEEEEEE = 0 ve FFF...F = 0 ve S = 1 ise V = -0 EEEEEEEEEEE = 0 ve FFF...F = 0 ve S = 0 ise V = 0

23/529

C ve Sistem Programclar Dernei - C Ders Notlar - Necati Ergin

GENEL KAVRAMLAR ve TERMLERBir programlama dilinde yazlm kaynak dosyann (program) anlaml en kk paralarna "atom" (token) denir. Bir programlama dilinde yazlm bir metin, atomlardan oluur. Bir kaynak dosya, derleyici program tarafndan ilk nce atomlarna ayrlr. Bu ileme "atomlarna ayrma" (Tokenizing - Lexical analysis) denir. Farkl programlama dillerinin atomlar birbirlerinden farkl olabilir. Atomlar aadaki gibi gruplara ayrlabilir:

Atomlar ve Trleri

1. Anahtar Szckler

Anahtar szckler (keywords - reserved words) programlama dili tarafndan nceden belirlenmi anlamlara sahip atomlardr. Bu atomlar kaynak dosya iinde baka bir anlama gelecek biimde kullanlamazlar. rnein bu atomlarn deiken ismi olarak kullanlmalar geerli deildir. Standard ANSI C (C 89) dilinin 32 anahtar szc vardr: auto break case char const continue default do double else enum extern float for goto if int long register return short signed sizeof static struct switch typedef union unsigned void volatile while Derleyici yazan firmalar da kendi yazdklar derleyiciler iin ek anahtar szckler tanmlayabilir. Baz programlama dillerinde anahtar szcklerin kk ya da byk harf ile yazlmas bir anlam fark yaratmaz. Ama C'de btn anahtar szckler kk harf olarak tanmlanmtr. C byk harf kk harf duyarl olan (case sensitive) bir dildir. Ama dier programlama dillerinin ounda byk - kk harf duyarl yoktur (case insensitive). C dilinde rnein bir deikene "register" isminin verilmesi geerli deildir. nk "register" bir anahtar szcktr, C dili tarafndan ayrlmtr. Ama buna karn bir deikene REGISTER, Register, RegisTER isimleri verilebilir, nk bunlar artk anahtar szck saylmazlar.

Deikenler, ilevler, makrolar, deimezler gibi yazlmsal varlklara programlama dili tarafndan belirlenmi kurallara uyulmak kouluyla isimler verilebilir. Yazlmsal bir varla verilen isme ilikin atomlar isimlerdir (identifier). Her programlama dilinde olduu gibi C dilinde de kullanlan isimlerin geerliliini belirleyen kurallar vardr.

2. simler

leler (operators) nceden tanmlanm bir takm ilemleri yapan atomlardr. rnein +, -, *, / , >=, = */ */ */

le Nedir

Terim Nedir

lelerin ileme soktuklar nesne veya deimezlere terim (operand) denir. C'de ileler aldklar terim saysna gre gruba ayrlabilir.

i) Tek terimli ileler (unary operators) rnein ++ ve -- ileleri tek terimli ilelerdir. ii) ki terimli ileler (binary operators) Aritmetiksel ileler olan toplama '+' ve blme '/' ileleri rnek olarak verilebilir. iii) terimli ile (ternary operator) C'de terimli tek bir ile vardr. Bu ilecin ismi "koul ileci" dir(conditional operator). leler konumlarna gre yani teriminin ya da terimlerinin neresinde bulunduklarna gre de gruplanabilir: 1. Sonek Konumundaki leler (postfix operators) Bu tip ileler terimlerinin arkasna getirilirler. rnein sonek ++ ileci (x++) 2. nek Konumundaki leler (prefix operators) Bu tip ileler terimlerinin nne getirilirler. rnein mantksal deil ileci (!x) 3. Araek Konumundaki leler (infix operators) Bu tip ileler terimlerinin aralarna getirilirler. rnein aritmetik toplama ileci (x + y)

leler, yaptklar ilemin sonucunda bir deer retir. lelerin rettii deer, ayn ifade iinde var olan bir baka ilece terim olabilir. fade iinde en son deerlendirilen ilecin rettii deer ise ifadenin deeri olur. Bir ifadenin deeri, ifade iinde yer alan ilelerin rettii deerlere gre saptanr. lelerin en nemli zellii, yaptklar ilemin sonucu olarak bir deer retmeleridir. Programc, bir ifade iinde ilelerin rettii deeri kullanr ya da kullanmaz. lelerin rettii deer aadaki biimlerde kullanlabilir: i. lecin rettii deer bir baka deikene aktarlabilir: x = y + z;

lelerin Deer retmesi

73/529

C ve Sistem Programclar Dernei - C Ders Notlar - Necati Ergin

Yukardaki rnekte y + z ifadesinin deeri, yani + ilecinin rettii deer, x deikenine aktarlr. ii. retilen deeri bir ileve argman olarak gnderilebilir: func(y + z); Yukardaki rnekte func ilevine argman olarak y + z ifadesinin deeri, yani toplama ilecinin rettii deer gnderiliyor. iii. retilen deer return deyimi ile ilevlerin geri dn deerlerinin oluturulmasnda kullanlabilir: int func() { return (y + z) } Yukarda func isimli ilevinin geri dn deeri y + z ifadesinin deeri yani + ilecinin rettii deerdir. lelerin rettii deerin hi kullanlmamas C szdizimi asndan bir hataya neden olmaz. Ancak byle durumlarda derleyiciler ounlukla bir uyar iletisi vererek programcy uyarr. rnein: int main() { int x = 20; int y = 10; x + y; } return 0;

Yukardaki kod parasnda yer alan x + y ifadesinde '+' ileci bir deer retir. '+' ilecinin rettii deer terimlerinin toplam deeri, yani 30'dur. Ancak bu deer kullanlmyor. Byle bir ilemin bilinli olarak yaplma olasl dktr. Borland derleyicilerinde verilen uyar iletisi u ekildedir: warning : "code has no effect!" (uyar : "kodun etkisi yok")

C dilinde ifadelerin trleri ve deerleri sz konusudur. Bir ifadenin deerini derleyici u ekilde saptar: fade iindeki ileler ncelik sralarna gre deer retir, retilen deerler, ifade iindeki ncelii daha az olan ilelere terim olarak aktarlr. Bu ilemin sonunda tek bir deer elde edilir ki bu da ifadenin deeridir. int x = 10; int y = 3; int z = 15; printf("%d\n", z % y / 2 + 7 -x++ * y);

lelerin ncelii

74/529

C ve Sistem Programclar Dernei - C Ders Notlar - Necati Ergin

Yukardaki kod parasnda printf ilevi arsyla x % y / 2 + 7 -x++ * y ifadesinin deeri ekrana yazdrlr. Yazdrlan deer nedir? fade iindeki ileler ncelik sralarna gre deer retir, retilen deerler, dier ilelerin terimi olur. En son kalan deer ise ifadenin deeri, yani ekrana yazdrlan deer olur. Her programlama dilinde ilelerin birbirlerine gre ncelii sz konusudur. Eer ncelik kavram sz konusu olmasayd, ilelerin neden olaca ilemlerin sonular makineden makineye, derleyiciden derleyiciye farkl olurdu. C'de toplam 45 ile vardr. Bu ileler 15 ayr ncelik seviyesinde yer alr. C dilinin ile ncelik tablosu blm sonunda verilmitir. Bir ncelik seviyesinde eer birden fazla ile varsa, bu ilelerin ayn ifade iinde yer almas durumunda, ilelerin soldan saa m sadan sola m ncelikle ele alnaca da tanmlanmaldr. Buna, ncelik yn (associativity) denir. Ekteki tablonun 4. stunu ilgili ncelik seviyesine ilikin ncelik ynn belirtiyor. Tablodan da grld gibi her ncelik seviyesi soldan saa ncelikli deildir. 2, 13 ve 14. ncelik seviyelerinin sadan sola ncelik ynne sahip olduunu (right associative) gryorsunuz. Dier btn ncelik seviyeleri soldan saa ncelik seviyesine (left associative) sahiptir. Bir simge, birden fazla ile olarak kullanlabilir. rnein, ekteki tabloyu incelediinizde '*' simgesinin hem arpma ileci hem de bir gsterici ileci olan ierik alma ileci olarak kullanldn greceksiniz. Yine '&' (ampersand) simgesi hem bitsel ve ileci hem de gstericilere ilikin adres ileci olarak kullanlr.

C dilinde ilelerin ana ilevleri, bir deer retmeleridir. Ancak baz ileler, terimi olan nesnelerin deerlerini deitirir. Yani bu nesnelerin bellekteki yerlerine yeni bir deer yazlmasna neden olurlar. Bir ilecin, terimi olan nesnenin deerini deitirmesine ilecin yan etkisi (side effect) denir. Yan etki, bellekte yaplan deer deiiklii olarak tanmlanr. rnein atama ilecinin, ++ ve -- ilelerinin yan etkisi vardr. Bu ileler, terimleri olan nesnelerin bellekteki deerlerini deitirebilir.

lelerin Yan Etkileri

leler zerindeki Kstlamalar

Programlama dilinin kurallarna gre, baz ilelerin kullanmlaryla ilgili birtakm kstlamalar sz konusu olabilir. rnein ++ ilecinin kullanmnda, ilecin teriminin nesne gsteren bir ifade olmas gibi bir kstlama sz konusudur. Eer terim olan ifade bir nesne gstermiyorsa, yani sol taraf deeri deilse, derleme zamannda hata oluur. Kstlama, ilecin terim ya da terimlerinin trleriyle de ilgili olabilir. rnein kalan (%) ilecinin terimlerinin bir tamsay trnden olmas gerekir. Kalan ilecinin terimleri gerek say trlerinden olamaz. Terimin gerek say trlerinden birinden olmas geersizdir.

Aada ileler yaptklar ilere gre snflanyor:

lelerin Yaptklar lere Gre Snflandrlmas

Aritmetik ileler (arithmetic operators) Bu ileler aritmetik baz ilemlerin yaplmasna neden olur. Toplama, karma, arpma, artrma, eksiltme ileleri ile iaret ileleri, aritmetik ilelerdir. Karlatrma ileleri (relational operators) Bu ilelere ilikisel ileler de denir. Bu ileler bir karlatrma ilemi yaplmasn salar. Byktr, byk ya da eittir, kktr, kk ya da eittir, eittir, eit deildir ileleri karlatrma ileleridir. Mantksal ileler (logical operators)

75/529

C ve Sistem Programclar Dernei - C Ders Notlar - Necati Ergin

Bu ileler, mantksal ilemler yapar. Mantksal ve, mantksal veya, mantksal deil ileleri bu gruba girer. Gsterici ileleri (pointer operators) Bu ileler, adresler ile ilgili baz ilemlerin yaplmasn salar. Adres ileci, ierik ileci ile keli ayra ileci bu gruba girer. Bitsel ilem yapan ileler (bitwise operators) Bu ileler, bitsel dzeyde baz ilemlerin yaplmasn salar. Bitsel deil ileci, bitsel kaydrma ileleri, bitsel ve, veya, zel veya ileleri bu gruba giren ilelerdir. Atama ileleri (assignment operators) Bir nesneye atama yaplmasn salayan ilelerdir. Atama ileci ve ilemli atama ileleri bu gruba girer. zel amal ileler (special purpose operators) Bunlar farkl ilerin yaplmasn salayan ve farkl amalara hizmet eden ilelerdir. Koul ileci, sizeof ileci, tr dntrme ileci bu gruba giren ilelerdir. lk grup, programlama dillerinin hepsinde vardr. Bitsel ilem yapan ileler ve gsterici ileleri yksek seviyeli programla dillerinde genellikle bulunmaz. Programlama dillerinin ou, kendi uygulama alanlarnda kolaylk salayacak birtakm zel amal ilelere de sahip olabilir.

Aritmetik ileler, basit artimetiksel ilemler yapan ilelerdir.

Aritmetik leler

ki terimli, araek konumundaki (binary infix) ilelerdir. Dier btn programlama dillerinde olduklar gibi, terimlerinin toplamn ya da farkn almak iin kullanrlar. Yani rettikleri deer, terimlerinin toplam ya da fark deerleridir. Bu ilecin terimleri herhangi bir trden nesne gsteren ya da gstermeyen ifadeler olabilir. Terimlerinin ayn trden olmas gibi bir zorunluluk da yoktur. le ncelik tablosunun 4. seviyesinde bulunurlar. ncelik ynleri soldan saadr. Her iki ilecin de yan etkisi yoktur. Yani bu ileler terimlerinin bellekte sahip olduklar deerleri deitirmez. Toplama ve karma ileleri olan + ve ilelerini tek terimli + ve ileleriyle kartrmamak gerekir.

Toplama (+) ve karma(-) leleri

Bu ileler, tek terimli, nek konumundaki (unary prefix) ilelerdir. aret ileci eksi (-), teriminin deerinin ters iaretlisini retir. Yani derleyici, iaret eksi ilecinin kullanlmas durumunda terim olan deeri -1 ile arpacak ekilde kod retir. Bu ilecin terimi herhangi bir trden nesne gsteren ya da gstermeyen ifade olabilir. le ncelik tablosunun ikinci seviyesinde bulunurlar. ncelik yn sadan soladr. lecin bir yan etkisi yoktur, yani terimi olan nesnenin bellekteki deerini deitirmez. "aret eksi" ilecinin rettii, bir nesne deildir, bir sa taraf deeridir. Aadaki ifade matematiksel olarak doru olmasna karn C dilinde doru deildir, derleme zamannda hata oluumuna neden olur: int x; -x = 5;

aret leci Olan ve +

76/529

C ve Sistem Programclar Dernei - C Ders Notlar - Necati Ergin

x bir nesne olmasna kar x ifadesi bir nesne deil, x nesnesinin deerinin ters iaretlisi olan deerdir. -x ve 0 - (x) edeer ifadelerdir. -x ifadesi bir sol taraf deeri deildir, bu ifadeye bir atama yaplamaz. aret ileci art (+), yalnzca matematiksel benzerlii salamak asndan C diline eklenmi bir iletir. Derleyici tarafndan, tek terimli, nek konumunda bir ile olarak ele alnr. Terimi olan ifade zerinde herhangi bir etkisi olmaz. Teriminin deeriyle ayn deeri retir. +x ifadesi ile 0 + (x) ifadeleri edeerdir. #include int main() { int x = -5; x = -x - x; printf("x = %d\n", x); return 0; } x = -x x; Yukardaki ifadede 3 ile vardr. Soldan saa bu ileleri sayalm: Atama ileci '=', iaret ileci eksi '-', karma ileci '-'. fadenin deerinin hesaplanmasnda ile nceliklerine gre hareket edilir. nce ikinci seviyede bulunan eksi iaret ileci deer '5' deerini retir. retilen 5 deeri karma ilecinin terimi olur. Yaplan kartma ileminden retilen deer 10'dur. Bu deer de atama ilecinin terimi olur, bylece x deikenine 10 deeri atanr.

ki terimli, araek konumundaki ilelerdir. arpma ilecinin rettii deer, terimlerinin arpmdr. Blme ilecinin rettii deer ise sol teriminin sa terimine blmnden elde edilen deerdir. Bu ilelerin terimleri herhangi bir trden olabilir. Terimlerinin ayn trden olmas gibi bir zorunluluk yoktur. le ncelik tablosunun 3. seviyesinde bulunurlar. ncelik ynleri soldan saadr. Her iki ilecin de yan etkisi yoktur. Blme ilecinin kullanmnda dikkatli olmak gerekir. lecin her iki terimi de tamsay trlerinden ise ilecin rettii deer de bir tamsay olur. Yani bir tamsayy baka bir tamsayya blmekle bir gerek say elde edilmez. C programlama dilinde * simgesi ayn zamanda bir gsterici ileci olarak da kullanlr. Ama ayn simge kullanlmasna karn bu iki ile hibir zaman birbirine karmaz nk aritmetik arpma ileci iki terimli iken gsterici ileci tek terimlidir.

arpma (*) ve Blme (/) leleri

ki terimli, araek konumunda bir iletir. Terimlerinin her ikisi de tamsay trlerinden (char, short, int, long) olmak zorundadr. Herhangi bir teriminin gerek say trnden olmas geersizdir. lecin rettii deer, sol teriminin sa terimine blmnden kalandr. lecin yan etkisi yoktur. rnein: k = 15 % 4; /* burada k ya 3 deeri atanr*/ x = 2 % 7; /* burada x e 2 deeri atanr*/ int c = 13 - 3 * 4 + 8 / 3 - 5 % 2; Burada c deikenine 2 deeri atanr. nk ilem u ekilde yaplr:

Kalan (%)leci

77/529

C ve Sistem Programclar Dernei - C Ders Notlar - Necati Ergin

c = 13 - (3 * 4) + (8 / 3) - (5 % 2) c = 13 - 12 + 2 - 1; c = 2; Aadaki programda 3 basamakl bir saynn birler, onlar ve yzler basamaklar ekrana yazdrlyor: #include int main() { int x; printf("3 basamakli bir sayi girin: "); scanf("%d", &x); printf("birler basamagi = %d\n", x % 10); printf("onlar basamagi = %d\n", x % 100 / 10); printf("yuzler basamagi = %d\n", x / 100); } return 0;

Artrma (++) ve eksiltme (--) ileleri C dilinin en ok kullanlan ilelerindendir. Tek terimli ilelerdir. nek ya da sonek durumunda bulunabilirler. ++ ileci terimi olan deikenin deerini 1 artrmak, -- ileci de terimi olan deikenin deerini 1 eksiltmek iin kullanlr. Dolaysyla yan etkileri sz konusudur. Terimleri olan nesnenin bellekteki deerini deitirirler. Bu iki ile de 2. ncelik seviyesinde bulunduundan dier aritmetik ilelerden daha yksek ncelie sahiptir. 2. ncelik seviyesine ilikin ncelik yn sadan soladr. Yaln olarak kullanldklarnda, yani bulunduklar ifade iinde kendilerinden baka hibir ile olmakszn kullanldklarnda nek ya da sonek durumlar arasnda hibir fark yoktur. ++ ileci terimi olan nesnenin deerini 1 artrr, -- ileci terimi olan nesnenin deerini 1 eksiltir. Bu durumda ++c; ve c++ ;

Artrma (++) ve Eksiltme (--) leleri

deyimleri tamamen birbirine denk olup c = c + 1; anlamna gelirler. --c; ve c--; deyimleri tamamen birbirine denk olup c = c - 1; anlamna gelir. Bir ifade iinde dier ilelerle birlikte kullanldklarnda, nek ve sonek biimleri arasnda farkllk vardr: nek durumunda kullanldnda, ilecin rettii deer, artrma ya da eksiltme yapldktan sonraki deerdir. Yani terimin artrlm ya da azaltlm deeridir. Sonek durumunda ise ilecin rettii deer, artrma ya da eksiltme yaplmadan nceki deerdir. Yani terimi olan nesnenin artrlmam ya da azaltlmam deeridir. Nesnenin deeri ifadenin tm deerlendirildikten sonra artrlr ya da eksiltilir.

78/529

C ve Sistem Programclar Dernei - C Ders Notlar - Necati Ergin

x = 10; y = ++x; Bu durumda: ++x 11 ve y = 11 deeri atanr. x = 10; y = x++; Bu durumda x++ => 10 ve y deikenine 10 deeri atanr. Aadaki program inceleyin: #include int main() { int a = 10; int b = ++a; printf("a = %d b = %d\n", a, b); a = 10; b = a++; printf("a = %d b = %d\n", a, b); return 0; } Yukardaki birinci printf ars ifadesi ekrana 11 11 deerlerini yazdrrken ikinci printf ars ekrana 11 10 deerlerini yazdrr. Aadaki rnei inceleyin: #include int main() { int x = 10; int y = 5; int z = x++ % 4 * --y; printf("z = %d\n", z); printf("x = %d\n", x); printf("y = %d\n", y); } return 0;

Yukarda kodu verilen main ilevinde ilem sras u ekilde olur:

79/529

C ve Sistem Programclar Dernei - C Ders Notlar - Necati Ergin

z z z z y x

= x++ % 4 * 4; = 10 % 4 * 4; = 2 * 4; = 8; => 4 => 11

Aadaki rnei derleyerek altrn: #include int func(int x) { return ++x; } int { main() int a = 10; int b = func(a++); printf("a = %d\n", a); printf("b = %d\n", b); return 0;

}

80/529

C ve Sistem Programclar Dernei - C Ders Notlar - Necati Ergin

C ve C++ standartlarnda sklkla kullanlan ve derleyicinin kodu yorumlama biimi hakknda bilgi veren nemli terimler vardr:

C Standartlarnda Kullanlan Baz nemli Terimlere likin Aklama

Davran

Derleyicinin belirli bir kod parasn yorumlama ve anlamlandrma biimine "derleyicinin davran" (behavior) denir.

C'de ve C++'da baz ifadeler, derleyiciden derleyiciye deiebilen fakat standartlarda ak olarak belirtilmemi olan yorumlama farllklarna yol aabilir. Byle ifadelerden kanmak gerekir. Bu tr ifadelerde derleyicinin davranna "tanmsz davran" (undefined behavior) denir. Programcnn byle ifadeler yazmas programlama hatas olarak kabul edilir. nk eer bir ifade tanmsz davran olarak belirleniyorsa bir sistemde programn altrlmas sonucunda nasl bir durumla karlalacann hibir gvencesi yoktur. Tanmsz davrana yol aan kodlar szdizimi asndan geerlidir. rnein bir ifadede bir deiken ++ ya da - ilecinin terimi olarak kullanlmsa ayn ifadede o deiken artk bir kez daha yer almamaldr. Yer alrsa artk tanmsz davrantr.

Tanmsz Davran

Belirlenmemi Davran

Kaynak kodun derleyici tarafndan farkl yorumlanabildii fakat bu konuda seeneklerin snrl olduu durumlara belirlenmemi davran (unspecified behavior) denir. Derleyiciler belirsiz davranlarda hangi seenein seilmi olduunu belgelemek zorunda deildir. phesiz programcnn belirsiz davrana yol aacak ifadelerden kanmas gerekir.

C dilinin baz zellikleri, esneklik salamak amac ile standartlarda derleyici yazanlarn seimlerine braklmtr. rnein int trnn uzunluunun ne olduu, varsaylan char trnn signed m unsigned m olduu, i ie yorumlamalarn kabul edilip edilmedii tamamen derleyici yazanlara baldr. Derleyiciler, bu zelliklerin nasl seildiklerini belgelemek zorundadr. Bu tr davrana derleyiciye zg davran (implementation dependent behaviour) denir. Bu davran zellikleri pekok derleyicide menlerden deitirilebilmektedir.

Derleyiciye zg Davran

C standartlar temel olarak derleyiciyi yazanlar iin bir klavuz biimindedir. Derleyici sorunlu bir kodla karlatnda uygun dntrme ilemlerini yapamyorsa sorunun nedenine ilikin bir bildirimde bulunmak zorundadr. Standartlarda derleyicilerin sorunu programcya bildirme durumuna "bulgu iletisi" (diagnostic message) denmektedir. Standartlar iinde belirtilmi olan szdizimsel ve anlamsal kurallarn inendii durumlarda bir uyar iletisi verilmelidir. Bu iletinin uyar (warning) ya da hata (error) biiminde olmas, derleyicinin isteine braklmtr. Ancak derleyicilerin hemen hepsinde uyarlar, derleyiciler tarafndan giderilebilecek kk yanllar iin, hata ise daha byk yanllar iin verilir. rnein bir gstericiye farkl trden bir adresin dorudan atanmas C'nin kurallarna aykrdr. Bu durumda derleyici standartlara gre bir ileti vermelidir. Aslnda standartlara gre, uyar ya da hata iletisi verilebilir, ama C derleyicilerinin hemen hepsi uyar iletisi verir. Standartlarda baz kurallarn inenmesi durumunda derleyicinin aka bir ileti vermeyebilecei belirtilmitir (nodiagnostic required). Aslnda C standartlarnda belirtildii gibi kural inenmeleri durumunda derleyicinin ilemi baar ile bitirip bitirmeyecei aka belirtilmemitir. Yani standartlara gre derleyici, doru bir program derlemeyebilir, yanl bir program derleyebilir.

Bulgu letileri

81/529

C ve Sistem Programclar Dernei - C Ders Notlar - Necati Ergin

Ancak C++ standartlarnda durum byle deildir. Dilin kuralna uymayan kodlarda derleyici bir ileti vermeli, derleme ilemini baarszlk ile sonulanmaldr. Derleyiciler, standartlarda belirtilen zelliklerin dnda da baz zelliklere sahip olabilir. Bu tr zelliklere derleyicilerin eklentileri denir. Derleyicilerin eklentilerini kullanmak tanabilirlii azaltr.

++ ve -- leleriyle lgili Tanmsz Davranlar

++ ve -- ilelerinin baz kullanmlar, tanmsz davran zellii gsterir. Byle kodlardan saknmak gerekir. 1. Bir ifadede bir nesne ++ ya da -- ilelerinin terimi olmusa, o nesne o ifadede bir kez daha yer almamaldr. rnein aadaki ifadelerin hepsi tanmsz davran zellii gsterirler:

int x = 20, y; int a = 5; y = ++x + ++x; y = ++x + x a = ++a; /* tanmsz davran */ /* tanmsz davran */ /* tanmsz davran */

"Koul ileci", "mantksal ve ileci", "mantksal veya ileci" ve "virgl" ileciyle oluturulan ifadelerde bir sorun yoktur. Bu ilelerle ilgili nemli bir kurala ileride deineceiz. 2. Bir ilev arlrken ileve gnderilen argmanlarn birinde bir nesne ++ ya da -ilecinin terimi olmusa, bu nesne, ileve gnderilen dier argman olan ifadelerde kullanlmamaldr. Argman olan ifadelerin, ilevlerin ilgili parametre deikenlerine kopyalanmasna ilikin sra, standart bir biimde belirlenmemitir. Bu kopyalama ilemi, baz sistemlerde soldan saa baz sistemlerde ise sadan soladr. Aadaki rnei inceleyin: int a = 10; void func(int x, int y) { /***/ } int main() { func (a, a++); } /***/

/* Tanmsz davran */

Karlatrma leleri (ilikisel ileler)< > = == !=

C programlama dilinde toplam 6 tane karlatrma ileci vardr: kktr ileci (less than) byktr ileci (greater than) kktr ya da eittir ileci (less than or equal) byktr ya da eittir ileci (greater than or equal) eittir ileci (equal) eit deildir ileci (not equal)

Bu ilelerin hepsi, iki terimli, araek konumundaki (binary infix) ilelerdir.

82/529

C ve Sistem Programclar Dernei - C Ders Notlar - Necati Ergin

lk drt ile, ile ncelik tablosunun 6. seviyesinde bulunurken dier iki karlatrma ileci ncelik tablosunun 7. seviyesinde bulunur. Yani karlatrma ileleri, kendi aralarnda iki ncelik grubu oluturur. Karlatrma ileleri, aritmetik ilelerden daha dk ncelikli seviyededir. Dier programlama dillerinin ounda bool ya da boolean (Matematiki George Bool'un isminden) ismi verilen bir mantksal veri tr de doal bir veri tr olarak programcnn kullanmna sunulmutur. Byle dillerde bool veri tr, yalnzca mantksal doru ya da mantksal yanl deerlerini alabilen bir trdr. Bu dillerde karlatrma ilelerinin rettii deerler ise bu trdendir. rnein C++ ya da Java dillerinde durum byledir. C dilinde karlatrma ileleri, oluturduklar nermenin doruluu ve yanllna gre int trden 1 ya da 0 deerini retir. nerme doru ise 1 deeri retilirken, nerme yanl ise 0 deeri retilir. Bu ilelerin rettii deerler de tpk aritmetik ilelerin rettii deerler gibi kullanlabilir. Aadaki signum isimli ilevin tanmn inceleyin: int signum(int val) { return (val > 0) - (val < 0); } signum ilevine gnderilen argman 0'dan byk bir deerse ilev +1 deerine, argman 0'dan kk bir deerse ilev -1 deerine, argman 0 deeriyse ilev, 0 deerine geri dnyor. signum ilevinin geri dn deeri, karlatrma ilelerinin deer retmesinden faydalanlarak elde ediliyor. Baz programlama dillerinde (val > 0) - (val < 0); gibi bir ilem hata ile sonulanr. nk rnein Pascal dilinde val > 0 ifadesinden elde edilen deer doru (True) ya da yanl (False) dir. Yani retilen deer bool ya da boolean trndendir. Ama C doal bir dil olduu iin karlatrma ilelerinin rettikleri deer bool tr ile kstlanmamtr. C'de mantksal veri tr yerine int tr kullanlr. Mantksal bir veri trnn tamsay tryle ayn olmas C'ye esneklik ve doallk kazandrmtr. C dilinde yazlan birok kalp kod, karlatrma ilelerinin int trden 1 ya da 0 deeri retmesine dayanr. rnein x = y == z; Yukardaki deyim, C dili iin son derece doaldr ve okunabilirlii yksektir. Bu deyimin yrtlmesiyle x deikenine ya 1 ya da 0 deeri atanr. Karlatrma ileci, atama ilecinden daha yksek ncelik seviyesine sahip olduuna gre nce karlatrma ileci olan '==' deer retir, ilecin rettii deer bu kez atama ilecinin terimi olur. Bu durumda y deikeninin deerinin z deikenine eit olup olmamasna gre x deikenine 1 ya da 0 deeri atanr. Karlatrma ilecinin kullanlmasnda baz durumlara dikkat edilmelidir: int x = 12; 5 < x < 9

83/529

C ve Sistem Programclar Dernei - C Ders Notlar - Necati Ergin

Yukardaki ifade matematiksel adan doru deildir. nk 12 deeri 5 ve 9 deerlerinin arasnda deildir. Ancak ifade C kodu olarak ele alndnda doru olarak deerlendirilir. nk 6. seviyede olan kktr (= 5 && x = 'a' && ch 2 + ++ -~ ! * & sizeof (tr) * / % + > 6 < > = == != & ^ | && || ?: = += -= *= /= %= = &= |= ^= 15 ,

7 8 9 10 11 12 13 14

bitsel saa kaydrma ileci (bitwise shift right) kktr ileci (less than) byktr ileci (greater than) kk eittir ileci (less than or equal) byk eittir ileci (greater than or equal) eittir ileci (equal) eit deildir ileci (not equal to) bitsel ve ileci (bitwise and) bitsel zel veya ileci (bitwise exor) bitsel veya ileci (bitwise or) mantksal ve ileci (logical and) mantksal veya ileci (logical or) koul ileci (conditional) atama ileci (assignement) toplamal atama ileci (assignment with addition) karmal atama ileci (assignment with subtraction) arpmal atama ileci (assignment with multiplication) blmeli atama ileci (assignment with division) kalanl atama ileci (assignment with modulus) bitsel sola kaydrmal atama ileci (assignment with bitwise left shift) bitsel saa kaydrmal atama ileci (assignment with bitwise right shift) bitsel ve ilemli atama ileci (assignment with bitwise and) bitsel veya ilemli atama ileci (assignment with bitwise or) bitsel zel veya ilemli atama ileci (assignment with bitwise exor) virgl ileci (comma)

soldan saa

soldan saa soldan saa soldan saa soldan saa soldan saa soldan saa sadan sola sadan sola

soldan saa

92/529

C ve Sistem Programclar Dernei - C Ders Notlar - Necati Ergin

BLNRLK ALANI VE MRDaha nceki konularda nesnelerin isimlerinden, deerlerinden ve trlerinden sz edilmiti. Nesnelerin C dili asndan ok nem tayan zellii daha sz konusudur. Bunlar bilinirlik alan (scope), mr (storage duration) ve balant (linkage) zelliidir.

Bilinirlik alan (scope), bir ismin tannabildii program araldr. Derleyiciye bildirilen isimler, derleyici tarafndan her yerde bilinmez. Her isim derleyici tarafndan ancak "o ismin bilinirlik alan" iinde tannabilir. Bilinirlik alan dorudan kaynak kod ile ilgili bir kavramdr, dolaysyla derleme zamanna ilikindir. C dilinde derleyici, bildirimleri yaplan deikenlere kaynak kodun ancak belirli blmlerinde ulalabilir. Yani bir deikenin tanmlanmas, o deikene kaynak dosyann her yerinden ulalabilmesi anlamna gelmez. Bilinirlik alanlar C standartlar tarafndan 4 ayr grupta toplanmtr: i. Dosya Bilinirlik Alan (File scope) : Bir ismin bildirildikten sonra tm kaynak dosya iinde, yani tanmlanan tm ilevlerin hepsinin iinde bilinmesidir. ii. Blok Bilinirlik Alan (Block scope): Bir ismin bildirildikten sonra yalnzca bir blok iinde, bilinmesidir. iii. lev Bilinirlik Alan (Function Scope): Bir ismin, bildirildikten sonra yalnzca bir blok iinde bilinmesidir. Yalnzca goto etiketlerini kapsayan zel bir tanmdr. Bu bilinirlik alanna "goto deyimi" konusunda deinilecek. iv. lev Bildirimi Bilinirlik Alan (Function Prototype Scope): lev bildirimlerindeki, ilev parametre ayrac iinde kullanlan isimlerin tannabilirliini kapsayan bir tanmdr. Bu bilinirlik alanna "lev Bildirimleri" konusunda deinilecek. Bir kaynak dosya iinde tanmlanan deikenler, bilinirlik alanlarna gre "yerel" ve "global" olmak zere ikiye ayrlabilir:

Bilinirlik Alan

Bloklarn iinde ya da ilevlerin parametre ayralar iinde tanmlanan deikenlere, yerel deikenler (local variables) denir. C dilinde bloklarn iinde tanmlanan deikenlerin tanmlama ilemlerinin, bloun en banda yaplmas gerektiini biliyorsunuz. Yerel deikenler, blok iinde tanmlanan deikenlerdir, bir ilevin ana blou iinde ya da isel bir blok iinde bildirilmi olabilirler. Yerel deikenlerin bilinirlik alan, blok bilinirlik alandr. Yani yerel deikenlere yalnzca tanmlandklar blok iinde ulalabilir. Tanmlandklar bloun daha dndaki bir blok iinde bu deikenlere eriilemez. Aadaki programda tanmlanan deikenlerin hepsi yereldir. nk x, y, z isimli deikenler bloklarn iinde tanmlanyor. Bu deikenler yalnzca tanmlanm olduklar blok iinde kullanlabilir. Tanmlandklar blok dnda bunlarn kullanlmas geersizdir. Yorum satrlar iine alnan deyimler geersizdir. z ve y deikenleri bilinirlik alanlarnn dnda kullanlmtr. Yukardaki rnekte deikenlerin hepsi yerel olduu iin blok bilinirlik alan kuralna uyar, ancak bu durum, 3 deikenin de bilinirlik alannn tamamen ayn olduu anlamna gelmez. rnek programda x deikeni en geni bilinirlik alanna sahipken y deikeni daha kk ve z deikeni de en kk bilinirlik alanna sahiptir:

Yerel Deikenler

93/529

C ve Sistem Programclar Dernei - C Ders Notlar - Necati Ergin

#include int main() { int x = 10; printf("x = %d\n", x); { int y = 20; printf("y = %d\n", y); x = 30; { int z = 50; y = 60; printf("z = %d\n", z); printf("x = %d\n", x); printf("y = %d\n", y); } z = 100; /* Geersiz! */ y = x; printf("x = %d\n", x); printf("y = %d\n", y);

} y = 500; /* Geersiz! */ printf("x = %d\n", x); return 0; }

levlerin parametre deikenleri de (formal parameters), blok bilinirlik alan kuralna uyar. Bu deikenler ilevin ana blou iinde bilinir. lev parametre deikeninin bilinirlik alan, ilevin ana blounun kapanmasyla sonlanr. Yani ilev parametre deikeninin bilinirlik alan, ilevin ana bloudur. void func (int a, double b) { /* a ve b bu ilevin her yerinde bilinir. */ } Yukardaki rnekte func ilevinin parametre deikenleri olan a ve b isimli deikenler, func ilevinin her yerinde kullanlabilir.

C dilinde bloklarn dnda da deikenlerin tanmlanabileceini biliyorsunuz. Bloklarn dnda tanmlanan deikenler "global deikenler" (global variables) olarak isimlendirilir. Derleme ileminin bir yn vardr. Bu yn kaynak kod iinde yukardan aaya dorudur. Bir deiken yerel de olsa global de olsa, tanmlamas yaplmadan nce kullanlmas geersizdir. Global deikenler tanmlandklar noktadan sonra kaynak dosyann sonuna kadar her yerde bilinir:

Global Deikenler

94/529

C ve Sistem Programclar Dernei - C Ders Notlar - Necati Ergin

#include int g; void func() { g = 10; } int main() { g = 20; printf("g = %d\n", g); func(); printf("g = %d\n", g); return 0; /* g = 20 */ /* g = 10 */

}Yukardaki rnekte g deikeni blok dnda tanmland iin -ya da hibir ilevin iinde tanmlanmad iin- global deikendir. g deikeninin bilinirlik alan, dosya bilinirlik alandr. Yani g deikeni, tanmlandktan sonra tm ilevlerin iinde kullanlabilir. Yukardaki programda nce g global deikenine 20 deeri atanyor.Daha sonra bu deer printf ileviyle ekrana yazdrlyor. Daha sonra func ilevi arlyor. func ilevi arlnca kodun ak func ilevine geer. func ilevi iinde de g global deikeni bilinir. func ilevinde global y deikenine 10 deerinin atanmasndan sonra bu deer yine printf ileviyle ekrana yazdrlyor.

C dilinde ayn isimli birden fazla deiken tanmlanabilir. Genel kural udur: ki deikenin bilinirlik alanlar ayn ise, bu deikenler ayn ismi tayamaz. Ayn ismi tamalar derleme zamannda hata oluturur. ki deikenin bilinirlik alanlarnn ayn olmas ne anlama gelir? ki deikenin bilinirlik alanlar, ayn kapanan kme ayrac ile sonlanyorsa, bu deikenlerin bilinirlik alanlar ayn demektir. { float a; int b; double a; { int c; /*...*/ }

Ayn simli Deikenler

/* Geersiz */

} Yukardaki kod geersizdir. nk her iki a deikeninin de bilinirlik alan ayndr. Farkl bilinirlik alanlarna sahip birden fazla ayn isimli deiken tanmlanabilir. nk derleyiciler iin, artk bu deikenlerin ayn isimli olmas nemli deildir. Bunlar bellekte farkl yerlerde tutulur. Aadaki rnei inceleyin:

95/529

C ve Sistem Programclar Dernei - C Ders Notlar - Necati Ergin

#include int main() { int x = 100; printf("%d\n", x); { int x = 200; printf("%d\n", x); { int x = 300; printf("%d\n", x); } } return 0; } Yukardaki program parasnda bir hata bulunmuyor. nk her x deikeninin de bilinirlik alanlar birbirlerinden farkldr. Peki yukardaki rnekte i bloklarda x ismi kullanldnda derleyici bunu hangi x deikeni ile ilikilendirir? Bir kaynak kod noktas, ayn isimli birden fazla deikenin bilinirlik alan iinde ise, bu noktada deikenlerden hangisine eriilir? Derleyici, bir ismin kullanm ile karlatnda bu ismin hangi yazlmsal varla ait olduunu bulmaya alr. Bu ileme "isim arama" (name lookup) denir. sim arama, dar bilinirlik alanndan geni bilinirlik alanna doru yaplr. Yani derleyici sz konusu ismi nce kendi blounda arar. Eer isim, bu blok iinde tanmlanmam ise bu kez isim kapsayan bloklarda aranr. sim, kapsayan bloklarda da bulunamaz ise bu kez global isim alannda aranr. Dar bilinirlik alanna sahip isim, daha geni bilinirlik alannda yer alan ayn ismi maskeler, onun grnmesini engeller. Aadaki program inceleyin: void func1() { int k; /***/ } void func2() { int k; /***/ } void func3() { int k; /***/ } Yukardaki kod parasnda bir hata sz konusu deildir. Her ilevde de k isimli bir deiken tanmlanm olsa da bunlarn bilinirlik alanlar tamamen birbirinden farkldr. Bir global deikenle ayn isimli yerel bir deiken olabilir mi? ki deikenin bilinirlik alanlar ayn olmad iin bu durum bir hataya neden olmaz. Ayn isimli hem bir global hem de bir yerel deikene eriilebilen bir noktada, eriilen yerel deiken olur. nk ayn bilinirlik alannda, birden fazla ayn isimli deiken olmas durumunda, o alan iinde en dar bilinirlik alanna sahip olanna eriilebilir. Aadaki kodu inceleyin:

96/529

C ve Sistem Programclar Dernei - C Ders Notlar - Necati Ergin

#include int g = 20; /* g global deiken */

void func() { /* global g deikenine atama yaplyor. */ g = 100; /* global g deikeninin deeri yazdrlyor. */ printf("global g = %d\n", g); } int main() { int g; /* g yerel deiken */ /* yerel g deikenine atama yaplyor */ g = 200; /* yerel g yazdrlyor. */ printf("yerel g = %d\n", g); func(); /* yerel g yazdrlyor. */ printf("yerel g = %d\n", g); } return 0;

levlerin kendileri de btn bloklarn dnda tanmlandklarna gre global varlklardr. Gerekten de ilevler kaynak kodun her yerinden arlabilir. Ayn bilinirlik alanna ilikin, ayn isimli birden fazla deiken olmayacana gre, ayn isme sahip birden fazla ilev de olamaz. [Ancak C++ dilinde isimleri ayn parametrik yaplar farkl ilevler tanmlamak mmkndr.] Bildirilen bir isme bilinirlik alan iinde her yerde ulalamayabilir. nk bir isim, daha dar bir bilinirlik alannda ayn isim tarafndan maskelenmi olabilir. Bu yzden "bilinirlik alan" dnda bir de "grlebilirlik" (visibility) teriminden sz edilebilir. [C++ dilinde global bir ismin yerel bir isim tarafndan maskelenmesi durumda, global isme znrlk ileci (scope resolution operator) ismi verilen bir ilele eriim mmkndr.]

mr (storage duration / lifespan), nesnelerin, programn alma zama