За всяко присвояване a = b;
, стойността на b
се преобразува в стойност от типа a
, при условие че това е възможно, и тази преобразувана стойност се присвоява на a
. Така че най-външният актьорски състав, който предлагате, е излишен.
Не всички такива преобразувания обаче са възможни и преобразуването може да се използва за принудително преобразуване или за създаване на верига от легитимни преобразувания, където не съществува директно преобразуване, както в този следващ пример:
foo x;
bar * y = (void *)&x;
Няма имплицитно преобразуване от foo *
в bar *
, но има неявно преобразуване от който и да е тип указател на обект към и от void *
(въпреки че не е уточнено дали y
има използваема или полезна стойност).
Друга употреба на явни преобразувания е, когато променя значението на стойност - типичен пример е, когато искате да третирате байт I/O като неподписана стойност. Тъй като char
може да бъде със знак или без знак, преобразуването на char
директно в unsigned int
може да даде грешен отговор. Например искаме -1
да бъде стойността 255, а не -1. Така че имате нужда от:
char b = get_input();
unsigned int value = (unsigned char)b;
Преобразуването от char
в unsigned char
винаги произвежда "очакваната" байтова стойност без знак и след това е добре да преобразувате това в цяло число без знак.
person
Kerrek SB
schedule
27.10.2013
printf
е добър пример: можете да отхвърлите значителни части. (Помислете за система с 16 битаint
.) Правилният начин тук е да използватеprintf("%" PRIu32 "\n", result)
. - person Jens Gustedt   schedule 28.10.2013