C/Operaattorit
Tämä luku kertoo C:n operaattoreista.
Aritmeettiset operaatiot
[muokkaa | muokkaa wikitekstiä]Laskutoimitukset ovat C-kielessä helppoja. Kieli sisältää seuraavat yksinkertaiset aritmeettiset operaattorit.
| Operaattori | Kuvaus |
|---|---|
| + | yhteenlasku |
| - | vähennyslasku |
| * | kertolasku |
| / | jakolasku |
| % | jakojäännös |
Näillä operaattoreilla pystyt suorittamaan yksinkertaisia laskutoimituksia.
int a, b, c; a = 1 + 1; /* a on nyt 2 */ b = a + 5; /* b on nyt 7 */ c = b - 4; /* c on nyt 3 */ a = c * b; /* a on nyt 21 */
Monimutkaisemmissa laskutoimituksissa voidaan käyttää sulkuja selventämiseksi.
int luku = (6 / 2) * (2 + (32 % 7)); /* luku on nyt 18 */
C-kieli sisältää myös aritmeettisten operaattoreiden lyhyet muodot. Niitä käytetään muuttujien kanssa seuraavasti.
| Pitkä muoto | Lyhyt muoto | Kuvaus |
|---|---|---|
| x = x + 1 | x++ | Korottaa muuttujan arvoa yhdellä |
| x = x - 1 | x-- | Pienentää muuttujan arvoa yhdellä |
| x = x + 2 | x += 2 | Korottaa muuttujan arvoa kahdella |
| x = x - 2 | x -= 2 | Pienentää muuttujan arvoa kahdella |
| x = x * 2 | x *= 2 | Kertoo muuttujan arvon kahdella |
| x = x / 2 | x /= 2 | Jakaa muuttujan arvon kahdella |
| x = x % 2 | x %= 2 | Laskee muuttujan ja luvun 2 jakojäännöksen |
Etuliitteenä + ei muuta numeron arvoa, kun taas - ottaa vastaluvun, esim. -luku.
Operaattoreita ++ ja -- voidaan käyttää joko jälkiliitteenä (i++) tai etuliitteenä (++i). All on esimerkkejä lyhyiden muotojen käytöstä.
int luku = 0; luku += 2; /* luku on nyt 2 */ luku++; /* luku on nyt 3 */ luku *= luku; /* luku on nyt 9 */ --luku; /* luku on nyt 8 */
Jälkiliite- ja etuliitemuodot eroavat toisistaan palautusarvonsa osalta seuraavasti.
int luku = 0; int luku1 = luku++; /* luku on nyt 1, luku1 on nyt 0 */ int luku2 = ++luku; /* luku on nyt 2, luku2 on nyt 2 */
Vertailuoperaatiot
[muokkaa | muokkaa wikitekstiä]Kaikkien vertailuoperaattoreiden tulos on 1, jos vertailu pitää paikkansa, ja muuten 0.
Kun vertaillaan osoittimia, operaattorit vertaavat niiden osoitteita, ei niiden sisältöä.
| Muoto | Selite |
|---|---|
| x == y | Onko x yhtä suuri kuin y.
Liukuluvuilla tarkistus pitää lukuja yhtäpitävinä vain, jos ne esittävät aivan täysin samaa lukua (epäluvut tai NaN:t eivät ole koskaan yhtä kuin mikään luku, edes itsensä kanssa). |
| x != y | Onko x eri suuri kuin y. Käytännössä x == y:n vastakohta. |
| x < y | Onko x pienempi kuin y. |
| x <= y | Onko x pienempi tai yhtä suuri kuin y. |
| x > y | Onko x suurempi kuin y. |
| x >= y | Onko x suurempi tai yhtä suuri kuin y. |
Loogiset operaatiot
[muokkaa | muokkaa wikitekstiä]Loogisia operaattoreita on viisi:
| Muoto | Selite |
|---|---|
| !x | "ei"; totuusarvon vastakohta eli negaatio.
1, jos x on nolla (tai osoittimilla NULL), muuten 0. |
| x | y | "tai"; disjunktio.
1, jos x tai y on 1, muuten 0. Oikeasti tämä on bittioperaattori, joten se ei välttämättä toimi oikein loogisena operaattorina, jos x tai y on jotain muuta kuin 0 tai 1. Tarvittaessa voi tehdä !!(x) | !!(y) |
| x || y | "tai"; disjunktio, katkaiseva.
Tulos on x, jos se on jotain muuta kuin 0 (tai osoittimilla NULL), muuten y. Toisin kuin muut operaattorit (paitsi &&), lauseketta y ei edes lasketa, mikäli tämä palauttaa x:n. |
| x & y | "ja"; konjunktio.
1, jos x ja y on 1, muuten 0. Oikeasti tämä on bittioperaattori, joten se ei välttämättä toimi oikein loogisena operaattorina, jos x tai y on jotain muuta kuin 0 tai 1. Tarvittaessa voi tehdä !!(x) & !!(y) |
| x && y | "ja"; konjunktio, katkaiseva.
Tulos on x, jos x on yhtä kuin 0 (tai osoittimilla NULL), muuten y. Toisin kuin muut operaattorit (paitsi ||), lauseketta y ei edes lasketa, mikäli tämä palauttaa x:n. |
Bittioperaatiot
[muokkaa | muokkaa wikitekstiä]Nämä operaatiot vaikuttavan luvun bitteihin, jotka ilmenevät luvun binäärimuodosta. Esimerkeissä näytetään luku desimaali- ja binäärimuotoisina, ja lukujen oletetaan olevan 16-bittisiä ja etumerkittömiä (esim. unsigned short lähes kaikilla alustoilla). Kaikki bittikohtaiset operaatiot ovat vaihdannaisia, mutta bittisiirto-operaatiot eivät.
| Syntaksi | Selite | Esimerkki | Huomiot |
|---|---|---|---|
| ~x | Bittikohtainen EI (NOT): kääntää kaikki bitit | ~23456:
23456 = 0101101110100000
~ _________________
= 1010010001011111 = 42079
|
Etumerkittömillä luvuilla sama kuin vähentäminen tietotyypin maksimiarvosta - 1. Jos kahden komplementti käytössä, etumerkillisillä luvuilla ~x == -x - 1. |
| x | y | Bittikohtainen TAI (OR): bitti on 1, jos jompikumpi tai kummatkin on 1 | 53578 | 17473:
53578 = 1101000101001010
17473 = 0100010001000001
| _________________
= 1101010101001011 = 54603
|
Hyödyllinen bittimaskeissa |
| x & y | Bittikohtainen JA (AND): bitti on 1 vain jos kummatkin on 1 | 38587 & 4607:
38587 = 1001011010111011
4607 = 0001000111111111
& _________________
= 0001000010111011 = 4283
|
Hyödyllinen bittimaskeissa |
| x ^ y | Bittikohtainen ehdoton TAI (XOR): bitti on 1 vain jos toinen biteistä on 1 | 54498 ^ 25163:
54498 = 1101010011100010
25163 = 0110001001001011
^ _________________
= 1011011010101001 = 46761
|
Joissain kielissä ^ on potenssioperaattori, muttei C:ssä |
| x << y | Bittisiirto vasemmalle | 37 << 2:
37 = 0000000000100101
<< 2 ________________
0000000000100101<<
xx||||||||||||||..
= 0000000010010100 = 148
19438 << 2: 19438 = 0100101111101110
<< 2 ________________
0100101111101110<<
xx||||||||||||||..
= 0010111110111000 = 12216
|
Etumerkittömillä luvuilla vastaa kertomista kahden potenssilla, mutta ylivuotobitit jäävät pois. Jos kahden komplementti käytössä, etumerkillisillä luvuilla vastaa myös kertomista kahden potenssilla. |
| x >> y | Bittisiirto oikealle | 6000 >> 2:
6000 = 0001011101110000
>> 2 ________________
>>0001011101110000
..||||||||||||||xx
= 0000010111011100 = 1500
59959 >> 3: 59959 = 1110101000110111
>> 3 ________________
>>>1110101000110111
...|||||||||||||xxx
= 0001110101000110 = 7494
|
Etumerkittömillä luvuilla vastaa jakamista kahden potenssilla ja pyöristämistä alaspäin. Etumerkillisillä luvuilla tulos riippuu alustasta (vaikka käytössä olisi kahden komplementti). |
Muut operaatiot
[muokkaa | muokkaa wikitekstiä]sizeof palauttaa tietotyypin koon merkkeinä (eli tavuina). Jos sille annetaan muuttuja, palautettu koko on sen tietotyypin koko. Huomaa, että koska sizeof:n yksikkö on merkkejä (char), sizeof(char) on aina 1.
Ternäärioperaattori ehto ? niin : muuten laskee ja palauttaa arvon niin, jos ehto on tosi (muu kuin 0 tai NULL), ja muuten laskee ja palauttaa arvon muuten.
Jos pilkkua käytetään parametri- tai argumenttilistan ulkopuolella, se toimii operaattorina, joka laskee kaikki arvot ja palauttaa niistä viimeisen.
Laskujärjestys
[muokkaa | muokkaa wikitekstiä]Korkeimmat operaattorit lasketaan ensin.
| Laskujärjestys | Operaattori | Selitys | Sitomisjärjestys (suunta) |
|---|---|---|---|
| 1 | (...)++ | Korota arvoa yhdellä | Vasemmalta oikealle |
| (...)-- | Laske arvoa yhdellä | ||
| (...) | Funktiokutsu | ||
| [...] | Indeksi | ||
| . | Tietueen kenttä | ||
| -> | Tietueen kenttä osoittimen takaa | ||
| 2 | ++(...) | Korota arvoa yhdellä | Oikealta vasemmalle |
| --(...) | Laske arvoa yhdellä | ||
| +(...) | Numeerinen arvo ilman muutosta | ||
| -(...) | Vastaluku | ||
| !(...) | Looginen EI-operaattori | ||
| ~(...) | Bitti-EI-operaattori | ||
| (T)(...) | Tyyppimuunnos | ||
| * | Osoittimen seuraaminen | ||
| & | Osoitteen ottaminen | ||
| sizeof | Koon määritys | ||
| 3 | * | Kertolasku | Vasemmalta oikealle |
| / | Jakolasku | ||
| % | Jakojäännös | ||
| 4 | + | Yhteenlasku | |
| - | Vähennyslasku | ||
| 5 | << | Bittisiirto vasemmalle | |
| >> | Bittisiirto oikealle | ||
| 6 | < | Pienempi kuin | |
| <= | Pienempi tai yhtä suuri kuin | ||
| > | Suurempi kuin | ||
| >= | Suurempi tai yhtä suuri kuin | ||
| 7 | == | Yhtä suuri kuin | |
| != | Eri suuri kuin | ||
| 8 | & | Bitti-/looginen JA-operaattori | |
| 9 | ^ | Bitti- ehdoton TAI -operaattori | |
| 10 | | | Bitti-/looginen TAI-operaattori | |
| 11 | && | Katkaiseva looginen JA-operaattori | |
| 12 | || | Katkaiseva looginen TAI-operaattori | |
| 13 | ? : | Ternäärioperaattori | |
| 14 | = | Sijoitusoperaattori, mukaan lukien kaikki lasku-sijoitusoperaattorit (esim. +=) | Oikealta vasemmalle |
| 15 | , | Pilkku | Vasemmalta oikealle |
| C-ohjelmointikieli |
|---|
|
Yksinkertainen C-kielinen ohjelma — Muuttujat — Operaattorit — Kommentit — Ohjausrakenteet — Funktiot — Osoittimet — Dynaaminen muistinvaraus — Taulukot — Merkkijonot — Tietueet — Esikääntäjä — Otsikkotiedostot C-kielen varatut sanat — Standardikirjasto — Aiheesta muualla |