Siirry sisältöön

C/Operaattorit

Wikikirjastosta
< C

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.
Siirrettävän määrän on oltava vähemmän kuin tietotyypissä on bittejä.

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).
Siirrettävän määrän on oltava vähemmän kuin tietotyypissä on bittejä.

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.

C-operaattorien laskujärjestys
Laskujärjestys Operaattori Selitys Liitännäisyys (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

EtusivuHistoriaTyökalut


Yksinkertainen C-kielinen ohjelmaMuuttujatOperaattoritKommentitOhjausrakenteetFunktiotOsoittimetDynaaminen muistinvarausTaulukotMerkkijonotTietueetEsikääntäjäOtsikkotiedostot


C-kielen varatut sanatStandardikirjastoAiheesta muualla