Для любого присвоения a = b;
значение b
преобразуется в значение типа a
, если это возможно, и это преобразованное значение присваивается a
. Таким образом, самый внешний состав, который вы предлагаете, является излишним.
Однако не все такие преобразования возможны, и приведение может использоваться для принудительного преобразования или для создания цепочки законных преобразований, где прямого преобразования не существует, как в следующем примере:
foo x;
bar * y = (void *)&x;
Неявного преобразования из foo *
в bar *
не существует, но существует существует неявное преобразование из любого типа указателя объекта в void *
и из него (хотя не указано, имеет ли y
пригодное или полезное значение).
Еще одно использование явного приведения — когда оно изменяет значение значения — типичный пример — когда вы хотите обработать байт ввода-вывода как беззнаковое значение. Поскольку 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