C/Muuttujat
Tämä luku kertoo C:n muuttujista.
Muuttujat ovat yksinkertaisesti nimiä, joilla me käsittelemme jotain paikkaa muistissa – paikkaa, joka sisältää arvon, jolla työskentelemme.
Koska C on suhteellisen alhaisen tason ohjelmointikieli, on muuttujille ensin varattava muistia ennen kuin sitä voidaan käyttää. Tämä tehdään esittelemällä muuttujat tavalla, jolla C-ohjelma näyttää käytettävien muuttujien määrän, miten ne nimetään ja kuinka paljon muistia ne tarvitsevat.
C:n alhaisesta tasosta johtuen tyyppien koot vaihtelevat laitteistosta riippuen. Tästä johtuen kun käsittelemme ja työskentelemme muuttujien kanssa, on tärkeää tietää minkä tyyppisiä muuttujat ovat ja mikä on näiden tyyppien koko.
Esittely, alustus ja sijoitus muuttujiin
muokkaaEnnen muuttujan käyttöä, se pitää esitellä.
int luku;
Tämä luo tarpeeksi tallennustilaa "luku"-nimiselle int-tyyppiselle (lyhennys engl. sanasta integer) muuttujalle. C-kielessä on aina ilmaistava mitä tyyppiä muuttuja on. Perustyypeille on erityisiä varattuja sanoja, joita käsittelemme myöhemmin.
Voit myös esitellä useita muuttujia yhdessä lauseessa:
int luku, luku2, luku3;
Lause sijoittaa kokonaisluvun 5 muistipaikkaan, jossa sijaitsee muuttuja kalat. Yhtä yhtäläisyysmerkkiä kutsutaan sijoitusoperaattoriksi (engl. assignment operator). Kun muuttuja on esitelty (ja mahdollisesti alustettu), voidaan siihen sijoittaa arvoja:
kalat = 5;
Vanhan C-standardin mukaan muuttujat täytyy esitellä lohkon alussa. Et voi esimerkiksi esitellä muuttujia, tulostaa "Hei maailma" ja esitellä lisää muuttujia (ellei tämä tapahdu eri ohjelmalohkossa). Uudempi standardi (C99) mahdollistaa muuttujien esittelyn muuallakin.
Muuttuja voidaan myös esitellä ja sijoittaa siihen jonkin arvon samaan aikaan. Tätä kutsutaan alustukseksi (engl. initialization):
int kalat = 5;
Voit myös sijoittaa muuttujaan toisen muuttujan arvon:
luku = luku3;
Tai voit käyttää sijoitusoperaattoria sarjassa:
luku = luku2 = luku3 = 75;
Sijoitukset etenevät oikealta vasemmalle, eli lopulta kaikkien muuttujien arvoina on 75. Tämä voi ensin näyttää oudolta, mutta avaa helpon tavan sijoittaa helposti moneen muuttujaan saman arvon.
On syytä huomata, että C-kielessä muuttujan arvo on (muutamaa poikkeusta lukuunottamatta) määrittelemätön jos sitä ei alusteta esittelyn yhteydessä. Alustamattomia muuttujia ei siis ole syytä käyttää ennen kuin niihin on sijoitettu jotain, eikä varsinkaan kannata olettaa arvon olevan 0. Jos muuttujaa ei alusteta, muuttujan arvoksi jää samalla muistipaikalla viimeksi ollut arvo, joka voi olla miltei mitä tahansa.
Muuttujien nimeäminen
muokkaaHyvään tapaan kuuluu käyttää tallennettavaa dataa kuvaavia nimiä. Esimerkki huonosti nimetystä muuttujasta olisi kokonaislukumuuttuja kalat. Kaikki nimet eivät kuitenkaan käy:
- Nimissä sallittuja merkkejä ovat a-z, numerot ja alaviiva.
- C:n varattu sana ei voi olla muuttujanimi.
- Ensimmäinen merkki ei saa olla numero tai alaviiva.
Muuttujien nimessä merkitsevät usein vain ensimmäiset 31 merkkiä, mutta pidempiä saa käyttää. Tällöin kaksi 32-merkkistä muuttujaa voidaan tulkita samana, mikäli ensimmäiset 31 täsmäävät.
Muuttujatyypit
muokkaaC-kielen muuttujilla on neljä perustyyppiä.
Tyyppi | Kuvaus |
---|---|
char | merkki |
int | kokonaisluku |
float | liukuluku |
double | tarkempi liukuluku |
Joitakin perustyyppejä pystytään muuttamaan erityisillä etuliitteillä. Nämä etuliitteet ovat short, long, signed ja unsigned. Esimerkiksi unsigned int tarkoittaa etumerkitöntä kokonaislukua, joten se ei voi olla negatiivinen. Kun listaamme kaikki mahdolliset muuttujatyypit, saamme alla olevan listan.
ANSI C (C89) / ISO C (C90) -muuttujatyypit
muokkaaTyyppi | Kuvaus |
---|---|
char | merkki |
unsigned char | etumerkitön merkki |
signed char | etumerkillinen merkki |
int | kokonaisluku |
unsigned int | etumerkitön kokonaisluku |
signed int | etumerkillinen kokonaisluku |
short int | lyhyt kokonaisluku |
unsigned short int | etumerkitön lyhyt kokonaisluku |
signed short int | etumerkillinen lyhyt kokonaisluku |
long int | pitkä kokonaisluku |
unsigned long int | etumerkitön pitkä kokonaisluku |
signed long int | etumerkillinen pitkä kokonaisluku |
float | liukuluku |
double | tarkempi liukuluku |
long double | pitkä tarkempi liukuluku |
char on joko sama tietotyyppi kuin signed char tai unsigned char. Valinta riippuu alustasta ja kääntäjästä.
ISO C (C99) -muuttujatyypit
muokkaaC99 sisältää yllä lueteltujen tietotyyppien lisäksi seuraavat:
Tyyppi | Kuvaus |
---|---|
_Bool | totuusarvo (ks. stdbool.h) |
long long | vieläkin pidempi (yleensä 64-bittinen) etumerkillinen kokonaisluku |
unsigned long long | vieläkin pidempi (yleensä 64-bittinen) etumerkitön kokonaisluku |
float _Complex | kompleksiluku (ks. complex.h) |
double _Complex | tarkempi kompleksiluku (ks. complex.h) |
long double _Complex | pitkä tarkempi kompleksiluku (ks. complex.h) |
Muut tyypit
muokkaaUsein näkee myös tyyppiä size_t; ks. stddef.h.
Lukuliteraalien tyyppi
muokkaaLukuliteraalien (sellaisenaan koodiin kirjoitetun luvun) tietotyyppi on oletuksena int, jos se on kokonaisluku, ja double; jos se on desimaaliluku.
Tätä voi muuttaa päätteillä. Kokonaisluvuilla U tekee literaalin tietotyypistä etumerkittömän, L tekee literaalin tietotyypistä long:in, ja C99-standardista eteenpäin LL tekee literaalin tietotyypistä long long:in. U:ta voi käyttää yhdessä L:n tai LL:n kanssa. Desimaaliluvuilla f tekee literaalin tietotyypistä float:in ja L tekee literaalin tietotyypistä long double:n. Päätteiden kirjainkoolla ei ole merkitystä.
Esim. 3 on tietotyyppiä int, 2001UL tietotyyppiä unsigned long, 3.5 tietotyyppiä double ja -0.5 tietotyyppiä float.
Tyyppien määreet
muokkaaMuuttujien tyypeillä voi olla kaksi määrettä: const ja volatile. Ne voidaan kirjoittaa joko tyypin edelle (huomattavasti yleisempää) tai sen jälkeen.
const määrittelee vakion, jonka arvoa ei voi muuttaa alustamisen jälkeen.
int muuttuja = 1; muuttuja = 2; /* toimii */
const int vakio = 3; vakio = 4; /* ei toimi, vakiota ei voi enää muuttaa */
volatile määrittelee, että muuttuja on herkästi muuttuva, eli että sen arvo voi muuttua koska tahansa, vaikka kyseinen koodi itse ei muuttaisi sitä. Tämä on monimutkainen käsite, johon yleensä törmää vain edistyneissä tai alhaisen tason ohjelmissa.
Muuttujien näkyvyysalue
muokkaaKun muuttuja määritellään koodilohkon sisällä, se tavallisesti lakkaa olemasta, kun koodin suoritus poistuu siitä lohkosta. Tällaisella muuttujalla on niin sanotusti automaattinen elinaika (engl. automatic duration). Tätä voi muuttaa määreellä static, joka antaa muuttujalle staattisen elinajan. Tällöin muuttuja on kytköksissä itse funktioon, ja niitä on olemassa funktiossa vain yksi. Huomaathan, että tämä voi aiheuttaa ongelmia monisäikeisissä ohjelmissa tai sellaisissa, jossa funktiota saatetaan joissain tapauksissa kutsua itsensä sisältä.
int laskuri_joka_ei_toimi(void) { int lkm = 0; lkm = lkm + 1; return lkm; /* aina 1, koska kun funktiota laskuri_joka_ei_toimi() kutsutaan, jokaisen kutsun yhteydessä luodaan uusi lkm-muuttuja, jonka alkuarvo on 0. */ } int laskuri_joka_toimii(void) { static int lkm = 0; lkm = lkm + 1; return lkm; /* ensimmäisellä kutsulla 1, sitten 2, 3, jne. lkm on olemassa yhtä pitkään kuin funktio itsekin, ja niitä molempia on vain yksi koko ohjelmassa. */ }
Jos muuttuja määritellään suoraan tiedoston ylimmällä tasolla, sillä on automaattisesti staattinen elinaika. Muuttujat, joilla on staattinen elinaika, alustetaan aina. Jos ohjelmoija ei alusta niitä itse, ne alustetaan oletusarvolla, joka on kokonaisluvuilla 0, liukuluvuilla 0.0 ja operaattoreilla NULL. Tietueiden kentät alustetaan samoin säännöin, ja yhdisteillä ensimmäinen määritelty kenttä.
static tarkoittaa tiedoston tasolla eri asiaa: sitä, että muuttujaa ei näy muille kooditiedostoille, vaikka kooditiedostot linkattaisiin samaan ohjelmaan.
Määreellä extern voi esitellä muuttujia, jotka määritellään toisessa kooditiedostossa.
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 |