h1. Eksplisiittinen tyypinmuunnos (cast)
* Eksplisiittisessä tyypinmuunnoksessa muuttujan tyyppi muutetaan väliaikaisesti (eli lausekkeen suorituksen ajaksi) muunnoksessa ilmoitetuksi tyypiksi.
* Muunnos tehdään kirjoittamalla muuttujan nimen eteen sulkeisiin lausekkeessa käytettävä tyyppi.
h2. Syntaksi
{code}
(haluttu_tyyppi)muuttuja;
{code}
Tyypinmuunnos voidaan tehdä myös välitulokselle:
{code}
(haluttu_tyyppi)(muuttuja1*muuttuja2);
{code}
Tässä laskennan {{muuttuja1*muuttuja2}} tulokselle suoritetaan tyypinmuunnos.
h2. Esimerkki
Ajatellaan seuraavaa tilannetta:
{code}
int x;
printf("Anna kokonaisluku: ");
scanf("%d", &x);
printf("%d/2 = %d\n", x, x/2);
{code}
Koodissa halutaan tulostaa muuttuja {{x}} jaettuna kahdella.
Tämä toimii, niin kauan kun {{x}} on +kahdella jaollinen+.
Arvolla {{x = 4}} ohjelma tulostaa:
{noformat}4/2 = 2
{noformat}Mitä sitten jos {{x}} ei ole jaollinen kahdella?
Oletetaan että {{x = 3}}, tällöin ohjelma tulostaa laskutoimituksen kokonaislukuna:
{noformat}3/2 = 1
{noformat}Tämä ei käy päinsä, vaan haluamme luonnollisesti saada kaiken informaation oikein käyttäjälle. Yksi vaihtoehto on muuttaa muuttujan {{x}} tyyppi liukuluvuksi (float tai double), mutta tämä ei aina ole mahdollista tai haluttua. Tällöin voimme käyttää tyypinmuunnosta apuna.
{code}
int x;
printf("Anna kokonaisluku: ");
scanf("%d", &x);
printf("%d/2 = %f\n", x, (float)x/2); // Huom. 1. tulostus on %d. 2. taas %f
{code}
{note}{{(float)x}} riittää, sillä jos yksikin laskennan arvoista on {{float}}\-tyyppinen, on tuloskin tyyppiä {{float}}.{note}
Arvolla {{x = 3}} ohjelma tulostaa:
{noformat}
3/2 = 1.500000
{noformat} |