Přetypování funguje tak, že máme nějaký datový typ a my o něm řekneme, že je to ve skutečnosti jiný datový typ.

Vezmeme si typickou situaci, kdy chceme vydělit dvě int čísla, ale chceme, aby výsledek bylo číslo desetinné. Aby to bylo možné, tak musí být aspoň jedno číslo při dělení desetinné viz kapitola Aritmetické operace.

Tato situace se dá vyřešit operátorem pretypování (v angličtině cast)

#include <stdio.h>

int main()
{
    int x = 5;
    int y = 2;
    double vysledek = (double) x / (double) y;

    return 0;
}

Jak program funguje?

  1. Vytvoří se proměnná x a nastaví se na 5
  2. Vytvoří se proměnná y a nastaví se na 2
  3. Proměnná x se přetypuje s int na double
  4. Proměnná y se přetypuje s int na double
  5. Vydělí se 5.0 / 2.0
  6. Výsledek 2.5 se uloží do definované proměnné vysledek
  7. Program se ukončí

Program by fungoval stejně, i kdybychom přetypovali pouze proměnnou x

#include <stdio.h>

int main()
{
    int x = 5;
    int y = 2;
    double vysledek = (double) x / y;

    return 0;
}

Nebo pouze proměnnou y

#include <stdio.h>

int main()
{
    int x = 5;
    int y = 2;
    double vysledek = x / (double) y;

    return 0;
}

Je potřeba dávat pozor na to, že nelze všechno přetypovat na cokoliv. Kdybychom se poksuli přetypovat číslo na strukturu (viz kapitola Struktury).

#include <stdio.h>

struct struktura { int x; };

int main()
{
    struct struktura test = { .x = 10 };
    int x = (int) test;

    return 0;
}

Tak už se nám to nepodaří.

Obecně přetypování většinou nebudete potřebovat, ale je dobré o něm vědět.

Přetypování na void

Implicitní přetypování

Pokud použijeme operátor přetypování, tak se jedná o explicitní přetypování. Pokud se hodnota přetypuje automaticky bez operátoru, tak se jedná o implicitní přetypování.

Implicitní přetypování nastane například, pokud uložíme hodnotu typuunsigned int do proměné typu int (tyto typy viz kapitola Datový typ číslo).

#include <stdio.h>

int main()
{
    unsigned int x = 10;
    int y = x;

    printf("%i\n", y);

    return 0;
}

Odkazy

Následující kapitola: Zkrácené vyhodnocení

GitHub diskuze k této kapitole

Zpátky na přehled

Předchozí kapitola: Mezery v jazyku C