Yleistä
Muuttujiin talletetaan tiedot, joita ohjelma käsittelee. Tieto voi olla lukuja ja merkkejä, tieto voi olla esitetty yksittäinä arvoina tai taulukkomuodossa.
Muuttujan määritteleminen tapahtuu seuraavasti:
No Format |
---|
tyyppi muuttujan_nimi; |
, missä tyyppi
on tiedon tyyppi ja muuttujan_nimi
on muuttujan nimi.
Esimerkiksi yhden kokonaislukumuuttujan määritteleminen:
Code Block |
---|
int muuttuja1; |
Muuttujan tyyppi
Muuttujat ovat siis tietovarastoja, tietovarastot ovat erilaiselle tiedolle erikokoisia.
Siksi C-kielessä tiedolla on aina tyyppi, tyyppi kertoo muuttujan tarvitseman muistin määrän. Tietokoneen muistia kuvataan tavuilla. Tavun pituus on kahdeksan bittiä. Kahdeksalla bitillä voidaan kuvata luvut 0...255 tai
...
-128...+127.
...
Esimerkiksi
...
...
joka
...
sisältää
...
tietokoneen
...
esittämät
...
merkit,
...
jokainen
...
kirjoitettava
...
merkki
...
edustaa
...
lukua
...
0...255.
...
Täten
...
yksi
...
merkki
...
varaa
...
tietokoneelta
...
muistia
...
yhden
...
tavun.
...
(Unicode-merkistössä merkit esitetään kahdella tavulla, jolloin voidaan esittää 65535 erilaista merkkiä, jolloin miltei kaikki maailman merkit saadaan esitettyä ilman erillisiä kooditaulukoita)
C-kielen muuttujien tyypit ja arvoalueet 32 bittisessä järjestelmässä:
tyyppi | merkitys | tavuja | etumerkitön lukualue | etumerkillinen lukualue |
---|---|---|---|---|
| merkki | 1 | 0...255 | -128...+127 |
| lyhyt kokonaisluku | 2 | 0...65536 | -32767...+32768 |
| kokonaisluku | 4 | 0...4294967296 | -2147483647...+2147483648 |
| pitkä kokonaisluku | 8 | 0...18446744073709551615 | -9223372036854775808...+9223372036854775807 |
| reaaliluku | 4 | - | ? |
| kaksoistarkkuuden reaaliluku | 8 | - | ? |
| tavuosoitin (voidaan ajatella, että tämä ei tarkoita mitään) | - | - | - |
Muuttujan tyyppi kertoo sen, millaista tietoa muuttujaan voi tallentaa, esimerkiksi char OmaMuuttuja
voi tallettaa yhden merkin.
Eli muuttujaan OmaMuuttuja
voidaan sijoittaa yksi merkki, esimerkiksi:
Code Block |
---|
char UNI-koodissa merkkit esitetään kahdella tavulla, jollin voidaan esittää 65535, jolloin miltei kaikki maailman merkit saadaan esitettyä ilman erillisiä kooditaulukoita) C-kielessä muuttujilla voi olla seuraava tyyppi: • char = merkki • int = kokonaisluku • float = reaaliluku • double = kaksoistarkkuuden reaaliluku • void = tavuosoitin, (alussa voidaan ajatella, että tämä ei tarkoita mitään) Muuttujan tyyppi kertoo sen, millaista tietoa muuttujaan voi tallentaa, esimerkiksi _char OmaMuuttuja_ voi tallettaa yhden merkin. Eli muuttujaan OmaMuuttuja voidaan sijoittaa yksi merkki, esimerkiksi, OmaMuuttuja = 'a'; // huom\! yksittäiset merkit laitetaan heittomerkkien väliin. |
Toinen esimerkki:
Code Block |
---|
esimerkki. int iLukuLuku = 5; // kokonaislukumuuttuja, joka voi tallettaa 16-bittisen etumerkillisen luvun Muuttuja voidaan haluttaessa myös alustaa esittelyn yhteydessä, esim. int Luku=5; char Merkki='a'; Muuttujalle voidaan antaa lisämääreitä: • signed = etumerkillinen • unsigned = etumerkitön • long = pitkä   |
Muuttujalle voidaan antaa lisämääreitä:
Määre | Merkitys | Käy seuraaviin tyyppeihin |
---|---|---|
| etumerkillinen | |
| etumerkitön | |
| pitkä | |
| lyhyt | |
Esim.
Code Block |
---|
; • short = lyhyt Esim. unsigned int Luku = 65535; // Muuttuja voi olla ainoastaan positiivinen kokonaisluku |
Muuttujan nimeäminen
Muuttuja kannattaa nimetä selkeällä nimellä, joka kertoo muuttujan käyttötarkoituksen. Huom! isot ja pienet kirjaimet tarkoittavat eri asiaa.
Puhdas C-kielen esittelytapa on seuraava:
Code Block |
---|
Lisämääreillä tarkennetaan tyyppiä. Lisämääreiden merkitys on kääntäjäkohtaista ja siksi ne on syytä tarkastaa ko. kääntäjän käsikirjoista. h2. Muuttujan nimeäminen Muuttuja kannattaa nimetä selkeällä nimellä, joka kertoo muuttujan käyttötarkoituksen. Huom\! isot ja pienet kirjaimet tarkoittavat eri asiaa. Puhdas C-kielen esittelytapa on seuraava: int auton_nopeus; |
Muuttujan
...
eri
...
sanat
...
voidaan
...
erotella
...
toisistaan
...
esimerkiksi
...
alaviivalla.
...
C++:ssa
...
käytetään
...
tyypillisesti
...
tapaa,
...
jossa
...
muuttujassa
...
olevat
...
sanat
...
aloitetaan
...
isoilla
...
kirjaimilla
...
seuraavasti:
Code Block |
---|
int AutonNopeus; |
Monet
...
ohjelmoijat liittävät
...
muuttujan
...
eteen
...
kirjaimen
...
kuvaamaan
...
muuttujan
...
tyyppiä
...
seuraavasti:
Code Block |
---|
int iAutonNopeus; |
Tyypistä
...
otetaan
...
yksi
...
kirjain
...
muuttujan
...
eteen
...
muistuttamaan
...
ohjelmoitsijaa
...
muuttujalle
...
annetusta
...
tyypistä.
...
(tätä
...
sanotaan
...
unkarilaiseksi
...
notaatioksi)
...
Edellä
...
mainitut
...
muuttujien
...
nimeystavat
...
eivät
...
vaikuta
...
millään
...
tapaa
...
muuttujan
...
käyttöön
...
tai
...
ohjelman
...
toimintaan.
...
Muuttujan
...
näkyvyysalue
...
Muuttuja
...
voi
...
olla
...
käytettävissä
...
ainoastaan
...
ohjelmalohkossa, yhdessä
...
funktiossa
...
(paikallinen),
...
yhdessä
...
tiedostossa
...
tai
...
koko
...
ohjelmassa.
...
Riippuen
...
siitä
...
missä
...
kohtaa
...
ohjelmaa
...
muuttuja
...
esitellään,
...
sitä
...
voidaan
...
käyttää
...
ohjelmassa
...
eri
...
tavoin.
...
Yhteinen muuttuja (global variable)
Yhteinen, tai globaali, muuttuja esitellään kaikkien funktioiden ulkopuolella ja se "näkyy" eli se on käytettävissä kaikissa funktioissa, jotka ovat samassa tiedostossa kuin muuttuja. Yhteistä muuttujaa on hyvin helppo käyttää, koska sen arvoon päästään käsiksi kaikista funktioista. Kun ohjelma kasvaa suureksi, siinä voi olla tuhansia muuttujia, jolloin yhteisten muuttujien käyttö tulee hankalaksi ja ohjelmasta tulee altis virheille.
Code Block |
---|
#include <stdio.h>
int x=0; // Yhteinen (globaali) muuttuja
int y=0; // Yhteinen (globaali) muuttuja
int main()
{
return 1;
}
|
Paikallinen muuttuja (local variable)
Paikallinen muuttuja esitellään ohjelmalohkon (tai funktion) sisällä ja se on käytettävissä ainoastaan siinä lohkossa, jossa se on määritelty. Alkuarvokseen paikallinen muuttuja saa satunnaisarvon, siksi paikalliset muuttujat tulee alustaa johonkin alkuarvoon esittelyn yhteydessä.
Paikallinen muuttuja katoaa (ja siten kadottaa arvonsa), kun ohjelmalohko (tai funktio) päättyy.
Esimerkki funktion paikallisesta muuttujasta:
Code Block |
---|
float funktio()
{
float f; // Funktion paikallinen muuttuja
printf("Anna liukuluku: ");
scanf("%f", &f);
printf("Annoit luvun %.2f\n", f);
return f;
}
int main()
{
int i;
float a=0.0; // Main-funktion paikallinen muuttuja
for (i=0; i<100; i++) {
a=funktio();
printf("a on %f",a);
}
return i;
}
|
Esimerkki ohjelmalohkon paikallisesta muuttujasta:
Code Block |
---|
int main()
{
int i; // Main-funktion paikallinen muuttuja
for (i=0; i<100; i++) {
float f; // For-toistorakenteen sisäinen paikallinen muuttuja
printf("Anna liukuluku: ");
scanf("%f", &f);
printf("Annoit luvun %.2f\n", f);
}
}
|
Samannimiset muuttujat
Ohjelmassa ei saa olla saman nimisiä muuttujia, paitsi jos ne on määritelty eri näkyvyysalueelle. Eli ohjelmassa voi olla globaali muuttuja int x
sekä myös mainissa muuttuja int x
. Tämä on sallittua, tosin ei suositeltavaa ilmiselvän sekaannusvaaran takia.
Code Block |
---|
#include <stdio.h>
int x = 5; // Globaali muuttuja
int main()
{
int x = -100; // Main-funktion paikallinen muuttuja
printf("x = %d\n", x);
}
|
Minkä arvon ohjelma tulostaa?
No Format |
---|
Vastaus: x = -100
|
Jos ohjelmassa on saman nimisiä muuttujia, viitataan aina 'lähinnä olevaan' eli rajatuimmalla näkyvyydellä olevaan.
Merkkijonot
Merkkijono on vektori eli yksiulotteinen taulukko. C-kielessä ei merkkijonoille ole valmista muuttujaa, vaan merkkijonot on esiteltävä vektoreina seuraavasti:
Code Block |
---|
char Sukunimi[100];
|
Merkkijono on tyyppiä char
ja merkkijonon perään laitetaan hakasulkuihin merkkien suurin sallittu määrä +1. Viimeinen merkkijonon merkki on varattu lopetusmerkille \0, jonka ascii arvo on nolla, siitä kääntäjä tietää, mihin merkkijono loppuu. Merkkijonon esittelyssä muistista varattu alue ei tyhjene vaan sinne jää aikaisempi sisältö.
Merkkijono voidaan alustaa esittelyn yhteydessä:
Code Block |
---|
char Sukunimi[100] = "Jokunen";
|
tai
Code Block |
---|
char Sukunimi[] = "Jokunen";
|
Viimeisessä vaihtoehdossa merkkijonon suurimmaksi sallituksi pituudeksi tulee 8 eli kun merkkijono alustetaan esittelyn yhteydessä ilman hakasulkujen välissä olevaa lukua, kääntäjä laskee merkkijonon pituuden automaattisesti.
...
Staattiset muuttujat
Paikallinen staattinen muuttuja
Jos halutaan paikallisen muuttujan muistavan arvonsa siitä, kun funktio suoritettiin edellisen kerran, täytyy muuttuja esitellä staattisena esim. seuraavasti:
Code Block |
---|
void funktio()
{
static int Laskuri; // Paikallinen staattinen muuttuja, säilyttää tietonsa funktiokutsujen välillä
}
int main()
{
}
|
Staattinen muuttuja saa automaattisesti alkuarvokseen nollan, joten sitä ei alusteta esittelyn yhteydessä. Staatisena esitellyllä muuttujalla voidaan esim. laskea, kuinka monta kertaa ko. funktiossa on käyty.
Yhteinen staattinen muuttuja
Haluttaessa rajata yhteisen muuttujan näkyvyys ainoastaan siihen tiedostoon, jossa se on esitelty, täytyy yhteinen muuttuja esitellä staattisena esim. seuraavasti:
Code Block |
---|
static long Summa; // Globaali staattinen muuttuja
int main()
{
}
|
Edellä oleva määrittely kannatta tehdä esim. silloin kun samaa ohjelmistoprojektia tekee useita henkilöitä ja halutaan estää samanimisten eri tiedostoissa olevien muuttujien vaikutus toisiinsa. Nämäkin muuttujat täytyy tietysti esitellä funktioiden ulkopuolella.