815338A Ohjelmointikielten periaatteet 2015-2016 IV.2 Imperatiivinen ohjelmointi lauseet ja lausekkeet
Sisältö 1. Yleistä lausekkeista 2. Presedenssi- ja assosiaatiosäännöt 3. Tyyppimuunnokset 4. Vertailulausekkeet ja loogiset lausekkeet 5. Yleistä lauseista 6. Sijoituslause ja ehdolliset lausekkeet 7. Ohjauslauseet 815338A Ohjelmointikielten periaatteet, Lauseet ja lausekkeet 2
IV.2.1. Yleistä lausekkeista Lauseke (expression) ohjelmointikielen peruselementtejä Ohjataan tietokoneen laskentaoperaatioita ohjelmointikielellä Kaikissa kielissä voidaan muodostaa lausekkeita yhdistelemällä operaattoreita ja operandeja Palauttaa aina ohjelmaan jonkin arvon, joka saadaan evaluoimalla lauseke 815338A Ohjelmointikielten periaatteet, Lauseet ja lausekkeet 3
IV.2.1. Yleistä lausekkeista (2) Operaattorit Unaariset kohdistuvat yhteen operandiin Binääriset kohdistuvat kahteen operandiin Joissakin kielissä myös ternäärisiä, kolmeen operandiin kohdistuvia operaattoreita Operandit Voivat olla vakioita, muuttujia tai funktiokutsuja 815338A Ohjelmointikielten periaatteet, Lauseet ja lausekkeet 4
IV.2.1.1. Lausekkeen evaluointi Ymmärtäminen olennainen osa ohjelmointikielen tuntemusta Lausekkeen evaluointi = sen arvon laskeminen käyttäen lausekkeessa esiintyvien vakioiden ja muuttujien suoritushetkisiä arvoja Tarvitaan sääntöjä lausekkeen arvon määrittämiseksi Operaattoreiden suoritusjärjestys, Operaattoreiden assosiatiivisuus Operandien arvojen evaluointijärjestys Joissakin kielissä (esim. C++) operaattorit ylikuormitettavissa (overload) Ei Javassa 815338A Ohjelmointikielten periaatteet, Lauseet ja lausekkeet 5
IV.2.1.2. Funktion arvon evaluointi Imperatiivisissa kielissä yleensä innokas evaluointi (eager evaluation) = Funktion arvo evaluoidaan joka kerran sitä kutsuttaessa käyttämällä syöteargumenttien senhetkisiä arvoja Joissakin funktionaalisissa kielissä laiska evaluointi (lazy evaluation) = evaluoidaan vasta kun tulosta tarvitaan Funktion sivuvaikutukset (side effects): sen vaikutus funktion parametreihin tai globaaleihin muuttujiin (yleensä varottava) 815338A Ohjelmointikielten periaatteet, Lauseet ja lausekkeet 6
IV.2.2. Presedenssi- ja assosiaatiosäännöt Määräävät operaattoreiden suoritusjärjestyksen Presedenssisäännöt säätelevät operaattoreiden keskinäistä suoritusjärjestystä Noudattavat (yleisesti) matematiikasta tuttuja lakeja Assosiaatiosäännöt määräävät, kumpi kahdesta presedenssiltään samanarvoisesta operaattorista suoritetaan ensin Yleisimmin vasemmalta oikealle tapahtuva suorittaminen 815338A Ohjelmointikielten periaatteet, Lauseet ja lausekkeet 7
IV.2.2.1. Aritmeettiset perusoperaattorit *x++=*y++ Yhteenlasku (+), vähennyslasku (-), kertolasku (*) ja jakolasku (/) Joissakin kielissä potenssiin korotukselle oma operaattorinsa, FORTRANissa ** Pascalissa oma operaattori div kokonaislukujen jakolaskulle (tuloksena kokonaisluku) Yleisesti myös kokonaislukujen jakojäännökselle oma operaattori C, C++ ja Java: %, Pascal: mod 815338A Ohjelmointikielten periaatteet, Lauseet ja lausekkeet 8
IV.2.2.2. Unaariset operaattorit Unaariset + ja - (etumerkki) C, C++ ja Java: Operaattoreilla ++ ja -- kaksi muotoa prefix ja postfix Prefix muodossa operaattori muuttujan eteen ja sovelletaan muuttujaan ennen lausekkeen muuta evaluointia Postfix muodossa operaattori muuttujan jälkeen, evaluointi tapahtuu vasta muun evaluoinnin jälkeen 815338A Ohjelmointikielten periaatteet, Lauseet ja lausekkeet 9
Aritmeettisten operaattorien presedenssisääntöjä C Java/C++ Pascal FORTRAN Ada Korkein postfix ++, -- postfix ++, -- prefix ++, -- *, /, div, mod ** **, abs prefix ++, -- unaarinen +, - (kaikki) +, - *, / *, /, mod unaarinen +, - *, /, % (kaikki) +, - unaarinen +, - *, /, % binäärinen +, - binäärinen +, - Alhaisin Binäärinen +, - 815338A Ohjelmointikielten periaatteet, Lauseet ja lausekkeet 10
Aritmeettisten operaattorien assosiatiivisuussääntöjä *x++=*y++ Kieli Assosiaatiosääntö C Oikealta prefix ++, --, unaarinen +, - Vasemmalta muut C++/Java Oikealta ++, --, unaarinen +, - Vasemmalta muut Pascal Vasemmalta kaikki FORTRAN Oikealta ** Vasemmalta muut Ada Vasemmalta kaikki paitsi ** ** on ei-assosiatiivinen 815338A Ohjelmointikielten periaatteet, Lauseet ja lausekkeet 11
IV.2.3. Tyyppimuunnokset *x++=*y++ Tarvitaan usein aritmeettisten lausekkeiden evaluoinnissa Eksplisiittiset (ohjelmoijan tekemät) Implisiittiset (tapahtuvat automaattisesti) Aritmeettisia operaatioita voidaan suorittaa eri tietotyypeille -> kielessä selkeät säännöt operaation tuloksen tyypistä ja siitä, minkä tyyppisinä operandeja käsitellään Binääriset operaatiot on yleensä määritelty vain saman tietotyypin operandeille -> Joudutaan usein tekemään pakotettuja tyypinmuunnoksia (coercion) 815338A Ohjelmointikielten periaatteet, Lauseet ja lausekkeet 12
IV.2.3. Tyyppimuunnokset (2) Esimerkki. C:ssä double osamaara; osamaara = 5/2; -> osamaara = 2.0 (kääntäjä tulkitsee literaalit 5 ja 2 kokonaisluvuiksi -> kokonaislukujen jakolasku, jonka tulos (2) muunnetaan double tyyppiseksi) Muodossa osamaara = 5.0/2; tulos on 2.5 Pascalissa jakolasku / tuottaa aina reaaliluvun, kokonaislukujen jakolaskulle on oma operaattori div 815338A Ohjelmointikielten periaatteet, Lauseet ja lausekkeet 13
IV.2.3.1 Eksplisiittinen tyypinmuunnos Useimmissa kielissä mahdollinen Tapahtuu erityisellä operaattorilla tai muistuttaa syntaksiltaan funktiokutsua Esimerkki: C:ssä edellinen jakolasku: int osoittaja = 5; int nimittaja = 2; double osamaara = (double)osoittaja/nimittaja; //Nyt 2.5 C/ C++:ssa kutsutaan kastaukseksi (cast) 815338A Ohjelmointikielten periaatteet, Lauseet ja lausekkeet 14
IV.2.3.1 Eksplisiittinen tyypinmuunnos (2) C++:ssa myös neljä operaattoria muunnokseen: static_cast, dynamic_cast, reinterpret_cast, const_cast *x++=*y++ Tulisi käyttää mieluummin kuin suoraa muunnosta Esimerkki double e = 2.71828; int luku = static_cast<int>(e); 815338A Ohjelmointikielten periaatteet, Lauseet ja lausekkeet 15
IV.2.3.1 Eksplisiittinen tyypinmuunnos (3) *x++=*y++ Eksplisiittinen tyypinmuunnos voi olla joko laajentava tai kaventava Laajentava esimerkiksi muunnos float > double Kaventava päinvastoin Kaventavia ja epäsovinnaisia tyypinmuunnoksia kannattaa käyttää harkiten 815338A Ohjelmointikielten periaatteet, Lauseet ja lausekkeet 16
IV.2.4. Vertailulausekkeet ja loogiset lausekkeet Vertailulauseke (relational expression) koostuu kahdesta operandista ja vertailuoperaattorista Arvo looginen totuusarvo Vertailuoperaattorien presedenssi kaikissa kielissä alhaisempi kuin aritmeettisten operaattoreiden -> aritmeettisten lausekkeiden vertailussa laskutoimitukset suoritetaan ensin Esimerkki. Olkoon a = 8 ja b= 4. Silloin lausekkeen a + 5 < 3*b; arvo on epätosi 815338A Ohjelmointikielten periaatteet, Lauseet ja lausekkeet 17
IV.2.4. Vertailulausekkeet ja loogiset lausekkeet (2) Looginen lauseke eli totuusarvolauseke (Boolean expression) koostuu totuusarvotyypin muuttujista ja vakioista sekä vertailulausekkeista ja totuusarvooperaattoreista (Boolean operators) Totuusarvo (tosi tai epätosi) lasketaan propositiologiikan mukaan 815338A Ohjelmointikielten periaatteet, Lauseet ja lausekkeet 18
IV.2.4.1 Vertailuoperaattoreita eri kielissä *x++=*y++ Operaatio C, C++, Java Pascal Yhtäsuuri == =.EQ. FORTRAN Erisuuri!= <>.NE. Suurempi > >.GT. Pienempi < <.LT. Suurempi t. yhtäsuuri Pienempi t. yhtäsuuri >= >=.GE. <= <=.LE. 815338A Ohjelmointikielten periaatteet, Lauseet ja lausekkeet 19
IV.2.4.2. Loogisten operaattoreiden ominaisuuksia Totuusarvo-operaattoreiden presedenssien suhde aritmeettisiin ja vertailuoperaattoreihin yleisimmin: 1. Looginen negaatio 2. Aritmeettiset operaattorit 3. Vertailuoperaattorit 4. Looginen XOR 5. Looginen JA 6. Looginen TAI 815338A Ohjelmointikielten periaatteet, Lauseet ja lausekkeet 20
IV.2.4.2. Loogisten operaattoreiden ominaisuuksia (2) Negaatio-operaattori, looginen JA ja looginen TAI: Pascal (ja monet muut): NOT, AND ja OR C/C++ Java:!,&& ja, C/C++ Java: lisäksi poissulkeva tai ^ (eli looginen XOR) 815338A Ohjelmointikielten periaatteet, Lauseet ja lausekkeet 21
IV.2.4.2. Loogisten operaattoreiden ominaisuuksia (3) Pascal poikkeaa e.m. presedenssisäännöistä Vertailuoperaattorit alemmalla tasolla kuin loogiset operaattorit AND samalla tasolla kertolaskun kanssa OR samalla tasolla yhteenlaskun kanssa Esimerkki. a < 10 OR b > 15; ei käänny Pascalissa, oltava (a < 10) OR (b > 15); 815338A Ohjelmointikielten periaatteet, Lauseet ja lausekkeet 22
IV.2.4.2. Loogisten operaattoreiden ominaisuuksia (4) C :ssä ei varsinaista loogista tietotyyppiä -> mahdollisuus kirjoittaa epäsovinnaisia vertailulausekkeita, esim. int x=2,y=1,z=0,u,v; u = y==z<x; v = x<y<z; muuttujalle v arvo 0 ja u:n arvo voi riippua kääntäjästä (yleisimmin saa arvon 1) *x++=*y++ 815338A Ohjelmointikielten periaatteet, Lauseet ja lausekkeet 23
IV.2.4.3. Oikosulkuevaluointi Englanniksi short-circuit evaluation Lausekkeen arvon määrääminen ennen kuin sen kaikkien operandien arvoja on määrätty Sovelletaan yleensä loogisiin lausekkeisiin Esimerkki. Jos a >= 25, niin (Pascalissa) (a < 25) AND (b > 10) aina epätosi -> toinen vertailu voidaan jättää tekemättä 815338A Ohjelmointikielten periaatteet, Lauseet ja lausekkeet 24
IV.2.4.3. Oikosulkuevaluointi (2) Voidaan käyttää hyväksi yksinkertaistamaan koodia C, C++ ja Java käyttävät loogisten lausekkeiden evaluoinnissa Ei käytetä yleisesti aritmeettisten lausekkeiden evaluoinnissa 815338A Ohjelmointikielten periaatteet, Lauseet ja lausekkeet 25
IV.2.5. Yleistä lauseista *x++=*y++ Ohjelma koostuu primitiivisistä eli atomisista lauseista sekä näitä yhdistelemään tarkoitetuista ohjauslauseista (kontrollilauseista) Yhdessä peräkkäisyyden (kompositio) kanssa muodostavat kielen ohjausrakenteet Primitiiviset lauseet: 1. Sijoituslause, 2. Aliohjelmakutsu ja 3. Tyhjä lause 815338A Ohjelmointikielten periaatteet, Lauseet ja lausekkeet 26
IV.2.5. Yleistä lauseista (2) Ohjelmointikielessä lauseet erotettava toisistaan 1. Erikoismerkki päättää lauseen Yleisin nykyään käytetty tapa 2. Erikoismerkki erottaa lauseet Käytetään Pascalissa 3. Rivinvaihto päättää lauseen Käytetään FORTRANissa, Pythonissa 4. Kielen syntaksi suunniteltu niin, ettei lauseiden erotin- tai lopetusmerkkiä tarvita Esimerkki: CLU Tyhjää lausetta käytetään, kun syntaksi vaatii lauseen, mutta ei haluta suorittaa toimintoa 815338A Ohjelmointikielten periaatteet, Lauseet ja lausekkeet 27
IV.2.6. Sijoituslause ja ehdolliset lausekkeet *x++=*y++ Sijoituslause (assignment) imperatiivisen ohjelmoinnin perusta Ohjelmoija sitoo dynaamisesti muuttujan tunnisteen tietokoneen muistipaikassa olevaan arvoon Yleensä sijoitusoperaattorina yhtäsuuruusmerkki = Pascalissa ja Adassa yhdistelmä := Yleensä kielten vertailuoperaattori eroaa sijoitusoperaattorista C, C++ ja Java: voidaan käyttää kahta unaarista operaattoria ++ ja -- sijoituslauseena: luku++; (tai ++luku;) tarkoittaa sijoitusta luku = luku+1; 815338A Ohjelmointikielten periaatteet, Lauseet ja lausekkeet 28
IV.2.6. Sijoituslause ja ehdolliset lausekkeet (2) Yhdistetyt sijoitusoperaattorit Samaan muuttujaan sijoitettava arvo kirjoitetaan lyhemmin Monissa kielissä mukana (ALGOL 60:stä lähtien) Esimerkiksi C, C++ ja Java: osamaara /= luku; on lyhennysmerkintä lauseelle osamaara = osamaara/luku; 815338A Ohjelmointikielten periaatteet, Lauseet ja lausekkeet 29
IV.2.6.1. Ehdollinen lauseke C, C++, C# ja Java sallivat ehdolliset lausekkeet Lauseke on muotoa <boolean_expression>? <expression1> : <expression2> Lauseke saa lausekkeen <expression1> arvon, mikäli <boolean_expression> on tosi, muussa tapauksessa lausekkeen <expression2> arvon 815338A Ohjelmointikielten periaatteet, Lauseet ja lausekkeet 30
IV.2.6.2. Sijoituslause lausekkeena Ainakin C, C++, C# ja Java-kielissä sijoituslause voi esiintyä myös operandina lausekkeessa, esimerkiksi int x,y,z = 5; x = y = z; // Nyt x ja y == 5 Sijoituslauseen käyttäminen operandina lisää lausekkeisiin sivuvaikutuksia -> heikentää luettavuutta ja erityisesti C:ssä luotettavuutta 815338A Ohjelmointikielten periaatteet, Lauseet ja lausekkeet 31
IV.2.7. Ohjauslauseet Ohjauslauseilla (control statements) toteutetaan kielen ohjausrakenteet Yleensä kielissä useampia ohjauslauseita Ohjausrakenteet muotoutuneet 1960- ja 1970- lukujen taitteessa rakenteisen ohjelmoinnin (structured programming) mukana Havainto: pelkkä peräkkäisyys ja ehdollinen hyppykäsky johtivat suuremmissa ohjelmissa lukukelvottomaan ja epäluotettavaan koodiin 815338A Ohjelmointikielten periaatteet, Lauseet ja lausekkeet 32
IV.2.7. Ohjauslauseet (2) Rakenteisen ohjelmoinnin ihanne: ohjelma koostuu sisäkkäisistä rakenteista, joilla kullakin yksi tulo- ja poistumiskohta Tarvitaan useammanlaisia valinta- ja toistolauseita Useissa nykykielissä (esimerkiksi Java) hyppykäsky (goto) jätetty pois Yleisesti nykykielten ohjausrakenteissa Koodin suoritus alkaa aina ensimmäisestä lauseesta (yksi tulokohta) Useamman tulokohdan sallimisen riskit suuremmat kuin edut Ohjausrakenteen sisältä voidaan poistua useammasta kohdasta 815338A Ohjelmointikielten periaatteet, Lauseet ja lausekkeet 33
IV.2.7.1. Valintalauseet Voidaan jakaa kahden vaihtoehdon lauseisiin ja monivalintalauseisiin Välimuoto: FORTRANin aritmeettinen valintalause: IF (ARITMEETTINEN LAUSEKE) N1, N2, N3 N1, N2 ja N3 viitteitä, joiden osoittamiin kohtiin hypätään lausekkeen arvon perusteella: Positiivisella arvolla hypätään kohtaan N1, nollalla kohtaan N2 ja negatiivisella kohtaan N3 Hyppykohdat voivat olla missä tahansa -> suuri ongelma luettavuuden kannalta ja altistaa virheille 815338A Ohjelmointikielten periaatteet, Lauseet ja lausekkeet 34
IV.2.7.1.1. Kahden vaihtoehdon valintalause *x++=*y++ Useimpien nykykielten valintalause pohjautuu ALGOL 60 kielen kahden vaihtoehdon valintalauseeseen: if (<looginen_lauseke>) then <lause1> [else <lause2>] Sisältää roikkuvan elsen ongelman: sisäkkäisistä if else rakenteista ei voida varmuudella sanoa, mihin if lauseeseen else kuuluu Semanttinen ratkaisu: else liittyy aina lähimpään if lauseeseen 815338A Ohjelmointikielten periaatteet, Lauseet ja lausekkeet 35
IV.2.7.1.1. Kahden vaihtoehdon valintalause (2) Adasta roikkuvan elsen ongelma poistettu: if ehto then... [else...] end if; 815338A Ohjelmointikielten periaatteet, Lauseet ja lausekkeet 36
IV.2.7.1.2. Monivalintarakenne Yleisimmin pohjautuu ALGOL-W kielen case lauseeseen: case <kokonaisluku_lauseke> of begin end <lause_1>; <lause_2>;... <lause_n> Lausekkeen kokonaisluku_lauseke arvolla 1 valitaan lause_1 jne. 815338A Ohjelmointikielten periaatteet, Lauseet ja lausekkeet 37
IV.2.7.1.2. Monivalintarakenne (2) Pascal: case lauseke of end const_list_1: <lause_1>; const_list_2: <lause_2>;... const_list_n: <lause_n> lauseke lueteltavaa tyyppiä, alkuaan ei oletusvalintaa (itse asiassa ei lainkaan määritelty, mitä tapahtuu, jos lausekkeen arvo ei ole mikään luetelluista arvoista) Myöhemmin lisätty mahdollisuus oletustoimintoon else -vaihtoehdolla 815338A Ohjelmointikielten periaatteet, Lauseet ja lausekkeet 38
IV.2.7.1.2. Monivalintarakenne (3) C pohjaiset kielet: switch(<lauseke>) { } case vakio_1: <lause_1>; case vakio_2: <lause_2>; case vakio_n: <lause_n>; [default: <oletus_lause>] Lauseke mitä tahansa lueteltavaa tyyppiä 815338A Ohjelmointikielten periaatteet, Lauseet ja lausekkeet 39
IV.2.7.1.2. Monivalintarakenne (4) C-pohjaisten kielten monivalinta jatkuu... Semantiikka: Lausekkeen arvoa verrataan lueteltuihin vakioihin. Kun arvo löydetään suoritetaan listan lauseita tästä lauseesta alkaen, kunnes kohdataan break-lause tai kontrollirakenne loppuu. Kummassakin tapauksessa kontrolli siirtyy rakennetta seuraavaan lauseeseen. Arviointi: joustava, mutta jostakin case-osasta breakin unohtaminen voi johtaa harvinaisiin virhetilanteisiin 815338A Ohjelmointikielten periaatteet, Lauseet ja lausekkeet 40
IV.2.7.2. Toistolauseet Voidaan jakaa määrättyihin ja määräämättömiin toistolauseisiin Määrätty: laskuri kontrolloi toistoa ja toistojen lukumäärä tiedetään etukäteen Määräämätön: looginen ehto kontrolloi toistoa ja lukumäärää ei välttämättä tiedetä ennalta. Toistorakenteen kontrolloimaa ohjelmalohkoa sanotaan usein silmukaksi (loop) 815338A Ohjelmointikielten periaatteet, Lauseet ja lausekkeet 41
IV.2.7.2.1. Määrätyt toistolauseet Silmukkalaskuri (silmukkamuuttuja, loop variable) kontrolloi silmukan päättymistä Silmukkalaskurin alkuarvo (initial value), loppuarvo (terminal value) ja askel (stepsize) ovat silmukkaparametreja (loop parameters) 815338A Ohjelmointikielten periaatteet, Lauseet ja lausekkeet 42
IV.2.7.2.1. Määrätyt toistolauseet (2) Määrätyn toistorakenteen arviointikriteerit: 1.Mikä on silmukkamuuttujan tyyppi ja näkyvyysalue? 2.Mikä on silmukkamuuttujan arvo silmukan päättymisen jälkeen? 3.Saako silmukkamuuttujan arvoa muuttaa silmukan sisällä ja vaikuttaako silmukan suorituksen lopettamiseen? 4.Evaluoidaanko silmukkaparametrit ainoastaan kerran vai joka iteraatiokerralla? 815338A Ohjelmointikielten periaatteet, Lauseet ja lausekkeet 43
IV.2.7.2.1. Määrätyt toistolauseet (3) FORTRANin toistorakenteen muoto DO <viite> <muuttuja> = <alkuarvo>,<loppuarvo> [,<askel>] Silmukan rajaa viite, esimerkiksi luvut 1,3,5,7 ja 9 tulostava silmukka voitaisiin kirjoittaa DO 100 I = 1,10,2 PRINT *,I 100 CONTINUE 815338A Ohjelmointikielten periaatteet, Lauseet ja lausekkeet 44
IV.2.7.2.1. Määrätyt toistolauseet (4) FORTRANin toistorakenne jatkuu... Versiossa 77 silmukkamuuttuja kokonaisluku- tai reaalilukutyyppiä, myöhemmin rajoitettu kokonaisluvuksi FORTRANissa ei saa muuttaa silmukkamuuttujan arvoa silmukan sisällä Silmukkamuuttujan arvoksi jää sille viimeksi määritelty arvo Silmukkaparametrit evaluoidaan kerran silmukkaan tultaessa ja näitä käyttäen lasketaan silmukan kierrosluku -> toistot tiedetään etukäteen 815338A Ohjelmointikielten periaatteet, Lauseet ja lausekkeet 45
IV.2.7.2.1. Määrätyt toistolauseet (5) Pascal kielen for lause: for var := alkuarvo (to downto)loppuarvo do <statement> Erittäin yksinkertainen Askel aina kooltaan 1, tehdään joko ylös- tai alaspäin Silmukkamuuttuja lueteltavaa tyyppiä; normaali muuttuja, jonka näkyvyysalue määräytyy kuten muuttujien yleensäkin 815338A Ohjelmointikielten periaatteet, Lauseet ja lausekkeet 46
IV.2.7.2.1. Määrätyt toistolauseet (6) Pascal-kielen toistorakenne jatkuu... Silmukkamuuttujan arvo silmukan päättyessä epämääräinen Alkuarvon ja loppuarvon evaluointi tapahtuu ainoastaan kerran -> muuttaminen silmukan sisällä ei vaikuta toistokertojen määrään Silmukkalaskurin arvoa ei saisi muuttaa silmukan sisällä Yleensä Pascalissa ei tarkisteta tätä 815338A Ohjelmointikielten periaatteet, Lauseet ja lausekkeet 47
IV.2.7.2.1.1 C-pohjaisten kielten for-lause Muoto: for(lauseke_1;lauseke_2;lauseke_3) lause; Erittäin joustava Ei varsinaista silmukkamuuttujaa 1. Ensimmäinen lauseke suoritetaan ennen silmukan ensimmäistä kierrosta 2. lauseke_2 kontrolloi silmukan päättymistä; evaluoidaan ennen jokaista silmukan kierrosta ja jos!= 0, silmukan seuraava kierros suoritetaan. 3. lauseke_3 evaluoidaan jokaisen kierroksen jälkeen 815338A Ohjelmointikielten periaatteet, Lauseet ja lausekkeet 48
IV.2.7.2.1.1 C-pohjaisten kielten for-lause (2) Huom! Lauseke voi olla useiden lausekkeiden muodostama lista, jolloin sen arvo on viimeisen lausekkeen arvo. Esim. for(i = 12; x = 0, y = 1; i++) { } printf("luuppi\n"); ikuinen silmukka *x++=*y++ 815338A Ohjelmointikielten periaatteet, Lauseet ja lausekkeet 49
IV.2.7.2.1.1 C-pohjaisten kielten for-lause (3) Java, erot C++ -kieleen 1.Javassa toisen lausekkeen on oltava looginen lauseke 2.Java ei salli lausekelistaa toisena lausekkeena for(int i = 0; bb = true, ba = false; i++) { } // SILMUKKA ei käy Javassa, käy C++:ssa *x++=*y++ 815338A Ohjelmointikielten periaatteet, Lauseet ja lausekkeet 50
IV.2.7.2.1.1 C-pohjaisten kielten for-lause (4) *x++=*y++ Kaikissa kielissä for silmukan lausekkeet voivat olla tyhjiä, esimerkiksi for(;;) { // SILMUKKA } ikuinen silmukka C-tyyppisessä for-lauseessa kaikkia silmukkaparametreja voidaan muuttaa silmukan sisällä 815338A Ohjelmointikielten periaatteet, Lauseet ja lausekkeet 51
IV.2.7.2.2. Määräämättömät toistolauseet Lopetusehtona looginen ehto Toistokertoja ei välttämättä tiedetä ennakolta Useimmissa kielissä on toteutettu erilaisia rakenteita tällaisille toistoille ALGOL 60-kielen toistolause ja C-kielen for-lause oikeastaan tällainen rakenne Määräämättömät toistolauseet ovat määrättyjä yksinkertaisempia -> problematiikka helpompi 815338A Ohjelmointikielten periaatteet, Lauseet ja lausekkeet 52
IV.2.7.2.2. Määräämättömät toistolauseet (2) Arviointikriteerit: *x++=*y++ 1.Testataanko ehto ennen silmukan suorittamista (alkuehtoinen toisto, pretest) vai sen jälkeen (loppuehtoinen toisto, posttest)? 2. Onko määräämätön toistolause määrätyn toistolauseen erikoistapaus vai erillinen lause? ALGOL 60:ssä kaikki toistorakenteet for-lauseella FORTRANissa ei loogista toistolausetta Toistolauseet toteutettava DO-silmukkaa ja hyppykäskyjä käyttäen 815338A Ohjelmointikielten periaatteet, Lauseet ja lausekkeet 53
IV.2.7.2.2. Määräämättömät toistolauseet (3) Java, C ja C++: toistolauseet sekä alku- että loppuehtoiselle toistolle. Alkuehtoinen muoto on while(lauseke) lause; Loppuehtoinen do lause; while(lauseke); *x++=*y++ 815338A Ohjelmointikielten periaatteet, Lauseet ja lausekkeet 54
IV.2.7.2.2. Määräämättömät toistolauseet (4) Java, C ja C++: toistolauseet jatkuu... Loppuehtoisen toiston lause suoritetaan ainakin kerran, vaikka lauseke olisikin aluksi epätosi. C:ssä lauseke on jokin aritmeettinen lauseke tai lausekkeiden muodostama lista, C++:ssa myös looginen lauseke *x++=*y++ Javassa lausekkeen on oltava looginen lauseke eikä listaa sallita 815338A Ohjelmointikielten periaatteet, Lauseet ja lausekkeet 55
IV.2.7.2.2. Määräämättömät toistolauseet (5) *x++=*y++ Pascalissa sekä alkuehtoinen että loppuehtoinen toisto: Alkuehtoinen toisto Loppuehtoinen toisto WHILE ehto DO lause; REPEAT lause1; lause2; UNTIL ehto; Loppuehtoisen toiston lopetuslogiikka on käänteinen C-kieleen verrattuna: lauseita toistetaan, kunnes ehto tulee todeksi. Huomaa: jälkimmäisessä lauselista, ei tarvita koottua lausetta. Alkuehtoisessa on oltava koottu lause. Ortogonaalisuuden puute Pascalissa 815338A Ohjelmointikielten periaatteet, Lauseet ja lausekkeet 56
IV.2.7.2.3. Pakotettu poistuminen silmukasta Helpottaa ohjelmointia, vaikka rikkoo rakenteisen ohjelmoinnin ihanteita (vain yksi poistumiskohta rakenteessa) Adassa rakenne silmukalle, joka on ikuinen, ellei ohjelmoija määrittele poistumiskohtaa loop if(toistoja > 10) then exit; end if; end loop; *x++=*y++ 815338A Ohjelmointikielten periaatteet, Lauseet ja lausekkeet 57
IV.2.7.2.3. Pakotettu poistuminen silmukasta (2) C-kieleen pohjautuvissa kielissä break käsky. for(;;) { } if(toistoja > 10) break; Poistumiskohtia voi olla useita (haittaa kuitenkin koodin luettavuutta -> käytä harkiten) Useimpiin kieliin toteutettu silmukasta poistuminen, mukavuushyöty katsotaan suuremmaksi kuin haitat 815338A Ohjelmointikielten periaatteet, Lauseet ja lausekkeet 58