Do sada smo naučili kako C++ radi sa različitim tipovima podataka:

  • int
  • float
  • double
  • char
  • bool
  • string

Ali u realnom programiranju podaci retko ostaju zauvek u istom obliku.

Vrlo često moramo da pretvaramo jedan tip podatka u drugi.

Na primer:

  • ceo broj u decimalni broj
  • decimalni broj u ceo broj
  • karakter u broj
  • broj u karakter
  • bool u broj
  • broj u bool

Ovaj proces zove se:

konverzija tipova podataka

ili:

type casting

Ovo je izuzetno važna tema jer se casting koristi gotovo svuda:

  • u matematici
  • radu sa funkcijama
  • obradi podataka
  • korisničkom unosu
  • radu sa memorijom
  • sistemskom programiranju

Ako ne razumemo casting, program može davati neočekivane rezultate.

U ovoj lekciji naučićemo:

  • šta je casting,
  • implicitnu i eksplicitnu konverziju,
  • gubitak podataka,
  • pretvaranje između numeričkih tipova,
  • char i ASCII konverzije,
  • bool konverzije,
  • i najčešće greške početnika.

Šta je konverzija tipova?

Konverzija znači:

pretvaranje jednog tipa podataka u drugi

Primer:

int broj = 10;
double cena = broj;

Ovde:

int

postaje:

double

Rezultat:

10 → 10.0

Program menja način predstavljanja podatka.

Zašto je casting potreban?

Zato što različiti tipovi imaju različitu namenu.

Primer:

int

za cele brojeve

Primer:

double

za decimalne brojeve

Ako želimo precizno deljenje:

5 / 2

nije dovoljno koristiti samo int.

Moramo promeniti tip.

Primer:

(double)5 / 2

Rezultat:

2.5

Bez konverzije:

2

Implicitna konverzija

Ovo je automatska konverzija koju C++ radi sam.

Primer:

int broj = 10;
double cena = broj;

C++ automatski pretvara:

10 → 10.0

Programer ne mora ništa posebno da napiše.

To je:

implicit conversion

Primer:

int a = 5;
double b = 2.5;

cout << a + b;

Rezultat:

7.5

Ovde C++ automatski pretvara a.

Zašto implicitna konverzija postoji?

Da bi programiranje bilo praktičnije.

Inače bismo stalno morali ručno da pretvaramo tipove.

Ali implicitne konverzije ponekad mogu napraviti problem.

Eksplicitna konverzija

Ovo je kada programer namerno kaže:

pretvori ovaj tip.

Primer:

double x = 9.8;
int broj = (int)x;

Rezultat:

9

Decimalni deo nestaje.

To je:

explicit cast

Klasični C-style cast

Primer:

(int)x

To je tradicionalni način.

Radi i danas.

Moderni C++ cast

Kasnije ćemo koristiti:

static_cast<int>(x)

To je moderniji i preporučen pristup.

Za početnike je lakše prvo razumeti:

(int)x

Gubitak podataka

Veoma važna tema.

Primer:

double broj = 15.99;
int x = (int)broj;

Rezultat:

15

Ne:

16

Casting ne zaokružuje.

On:

odseca decimalni deo

To je česta greška početnika.

Primer sa float

float temperatura = 36.8f;
int t = (int)temperatura;

Rezultat:

36

Decimalni deo se gubi.

Integer division problem

Veoma važna tema.

Primer:

int a = 5;
int b = 2;

cout << a / b;

Rezultat:

2

Zašto?

Jer oba operanda su int.

Ako želimo decimalni rezultat:

cout << (double)a / b;

Rezultat:

2.5

Ovde smo uradili cast.

int u char

Pošto char koristi ASCII kodove:

Primer:

int broj = 65;
char slovo = (char)broj;

cout << slovo;

Rezultat:

A

Jer:

65 = A

char u int

Obrnuto:

char slovo = 'A';

cout << (int)slovo;

Rezultat:

65

ASCII konverzija.

Broj u bool

Primer:

bool status = 1;

Rezultat:

true

Primer:

bool status = 0;

Rezultat:

false

Pravilo:

0 → false
sve ostalo → true

Primer:

bool x = 25;

Rezultat:

true

bool u int

Primer:

bool aktivan = true;

cout << (int)aktivan;

Rezultat:

1

Ako:

false

onda:

0

char i matematika

Primer:

char slovo = 'A';

slovo = slovo + 1;

cout << slovo;

Rezultat:

B

Zašto?

Jer:

A = 65
B = 66

Implicitni problemi

Primer:

double cena = 99.99;
int x = cena;

Radi.

Ali rezultat:

99

C++ automatski pretvara.

To može biti opasno ako ne primetimo.

Casting i unos podataka

Primer:

char brojKarakter = '7';

Ovo nije broj 7.

ASCII:

55

Ako želimo pravi broj:

potrebna je konverzija.

Primer:

int broj = brojKarakter - '0';

Rezultat:

7

Ovo je veoma koristan trik.

Moderni static_cast

Profesionalniji stil:

Umesto:

(int)x

možemo:

static_cast<int>(x)

Primer:

double cena = 19.95;

int celaCena = static_cast<int>(cena);

Isti rezultat:

19

Kasnije ćemo detaljnije učiti C++ cast stilove.

Najčešće greške početnika

1. Očekivanje zaokruživanja

Pogrešno očekivanje:

(int)9.9

da daje:

10

Ne.

Daje:

9

2. Nerazumevanje integer division

5 / 2

nije:

2.5

3. Mešanje char i brojeva

'5'

nije isto što i:

5

4. Neočekivane implicitne konverzije

Program radi

ali daje pogrešan rezultat.

5. Korišćenje bool bez razumevanja

bool x = 999;

rezultat:

true

Praktičan primer

#include <iostream>
using namespace std;

int main() {
    int a = 5;
    int b = 2;

    double rezultat = (double)a / b;

    cout << rezultat << endl;

    char slovo = 'A';
    cout << (int)slovo << endl;

    double cena = 19.95;
    cout << (int)cena << endl;

    return 0;
}

Rezultat:

2.5
65
19

Zašto je casting važan?

Bez castinga teško je raditi:

  • matematiku
  • obradu ASCII karaktera
  • funkcije
  • unos i validaciju
  • konverzije podataka
  • sistemski kod

Ovo je jedna od veoma važnih C++ tema.

Rezime

U ovoj lekciji naučili smo:

implicitna konverzija

automatska

eksplicitna konverzija

ručna

Važne opasnosti:

  • gubitak decimala
  • integer division
  • implicitne greške

Casting je osnovni alat ozbiljnog programiranja.

Mini test

  1. Šta je casting?
    a) Brisanje promenljive
    b) Pretvaranje tipa podatka
  2. Šta daje:
(int)9.8

a) 10
b) 9

  1. Šta daje:
5 / 2

a) 2
b) 2.5

  1. ASCII za A?
    a) 65
    b) 97
  2. Šta daje:
bool x = 5;

a) false
b) true

Zadaci za vežbu

  1. Pretvori double u int.
  2. Pretvori char u ASCII broj.
  3. Pretvori ASCII broj u karakter.
  4. Ispravi integer division problem.
  5. Probaj static_cast.

Domaći zadatak

Napravi program koji:

  • unosi dva cela broja
  • prikazuje integer deljenje
  • prikazuje decimalno deljenje pomoću castinga
  • prikazuje ASCII kod unetog karaktera

Pristupačnost