Siirry sisältöön

C/Muuttujat

Wikikirjastosta
< C

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

[muokkaa | muokkaa wikitekstiä]

Ennen 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

[muokkaa | muokkaa wikitekstiä]

Hyvää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

[muokkaa | muokkaa wikitekstiä]

C-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

[muokkaa | muokkaa wikitekstiä]
Tyyppi 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

[muokkaa | muokkaa wikitekstiä]

C99 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)

Usein näkee myös tyyppiä size_t; ks. stddef.h.

Lukuliteraalien tyyppi

[muokkaa | muokkaa wikitekstiä]

Lukuliteraalien (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

[muokkaa | muokkaa wikitekstiä]

Muuttujien 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

[muokkaa | muokkaa wikitekstiä]

Kun 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

EtusivuHistoriaTyökalut


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


C-kielen varatut sanatStandardikirjastoAiheesta muualla