Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.224.32.86] |
|
Страницы: (2) 1 [2] все ( Перейти к последнему сообщению ) |
Сообщ.
#16
,
|
|
|
trunc() возвращает целую часть аргумента в математическом смысле, т.е. округляет к -∞. Простой каст к целому отбрасывает дробную, т.е. округляет к 0. Разница будет на отрицательных аргументах.
XXXX_cast<type>(data) – в частности static_cast<>, всего их четыре разных – это новый стиль преобразования данных, которые в отличие от старого стиля (type)data не только говорит компилятору, что́ ты хочешь получить, но и зачем. Так, static_cast<> показывает, что ты имеешь желание получить данные с другими свойствами, определяемые их новым типом, при этом оставив сами данные иметь то же значение. Например, при касте целого 123 к вещественному 123.0 тебе важно, чтобы новые данные помимо получения новых свойств сохранили своё значение 123. Обычно это означает, что данные при этом сменят репрезентацию, т.к. бинарное представление целого и вещественного 123 сильно отличаются. Но вот если ты имеешь массив символов, а ты хочешь их рассматривать как массив целых, то static_cast<> тебе не поможет. Тебе нужно, оставив репрезентацию данных неизменной, сообщить компилятору, что они уже имеют новые нужные тебе свойства, осталось только лишь сообщить об этом компилятору. Поэтому char* ты должен кастовать к int* посредством reinterpret_cast<>. При этом важно понимать, что обычно репрезентация данных сильно зависит от реализации, а значит при порте этого кода на другую платформу можно сильно ушибиться лбом об стол. Иначе и быть не может, т.е. ты сам создал эту репрезентацию этих своих данных, так что компилятор тут тебя никак не проконтролирует. Итп. Суть в том, что сообщая компилятору не только цель, но и намерения, он сможет тебя обезопасить от ошибок. Старый стиль приведения типов этой информации компилятору не давал. К примеру, имея const int* ptr, ты запросто мог написать (long*)ptr, и компилятор молча это слопает, хотя у человека тут возникнет закономерный вопрос "что не так с const". То ли ты ошибся и забыл, что изначальные данные были константными, то ли ошибся и забыл в новом типе const написать, то ли ты не ошибся и в натуре хотел сразу два каста в одном. В целом, помимо фактора улучшенной диагностики кода (за малым исключением), что старый, что новый способы не отличаются. Добавлено Цитата Jin X @ Ну значит всё в порядке. Я ж говорю, тебе виднее.А зачем мне считать всё в long double, когда у меня вся суть именно в получении целочисленного результата (long long/uint64_t), и только в этом одном месте используется long double? Я бы использовал с удовольствием какой-нибудь llsqrt, принимающий long long, но вроде нет такого... Что касается C или C++ сигнатур, тут как бы тот же смысл: если ты сменишь тип данных, т.б. их свойства, плюсовый перегруженный синопсис их подхватит и отследит самостоятельно, в крайнем случае ругнётся, а C-шный с префиксами всегда будет брать в том формате, на который единственный и рассчитан. Опять же, вопрос человеческого фактора. Насколько он тебе тут важен, знаешь только ты. |
Сообщ.
#17
,
|
|
|
Цитата Qraizer @ Нет, ты путаешь trunc с floor (округление к -∞), т.к. trunc округляет к 0 (отбрасывая дробную часть), как и (int). Получается, разница только в типе возвращаемого значения?trunc() возвращает целую часть аргумента в математическом смысле, т.е. округляет к -∞. Простой каст к целому отбрасывает дробную, т.е. округляет к 0. Разница будет на отрицательных аргументах. Цитата Qraizer @ (int) = static_cast<int>, так?В целом, помимо фактора улучшенной диагностики кода (за малым исключением), что старый, что новый способы не отличаются. Цитата Qraizer @ Что такое "т.б."? "То бишь"? т.б. Добавлено Насколько вообще дурным тоном считается смешивание в коде синтаксиса/инструментов/функций C и C++ ? Скажем, (int) вместо static_cast<int>, printf вместо cout, использование _getch(), malloc и пр.? |
Сообщ.
#18
,
|
|
|
Цитата Jin X @ А. Ну да, попутал. Получается, только в типе результата, да.Цитата Qraizer @ Нет, ты путаешь trunc с floor (округление к -∞), т.к. trunc округляет к 0 (отбрасывая дробную часть), как и (int). Получается, разница только в типе возвращаемого значения?trunc() возвращает целую часть аргумента в математическом смысле, т.е. округляет к -∞. Простой каст к целому отбрасывает дробную, т.е. округляет к 0. Разница будет на отрицательных аргументах. Цитата Jin X @ Для стандартных типов да. Для пользовательских типов, т.б. классов, это не всегда так.(int) = static_cast<int>, так? Цитата Jin X @ Угу Ещё есть т.с. – ", так сказать,".Что такое "т.б."? "То бишь"? Цитата Jin X @ Та как бы пофик, но с нюансами. Библиотека C является частью библиотеки C++, Стандарт это предусматривает, так что в общем не страшно, если вдруг. Но между библиотеками есть отличия, большей частью несущественные. Как бы дань совместимости со старым кодом. Но не более того, так что в новых проектах видеть старый стиль при наличии нового как-то странно. Обычно засилье легаси в новом проекте говорит о небрежности автора, что в некоторых случаях неприятно может сыграть ему в карму. Насколько вообще дурным тоном считается смешивание в коде синтаксиса/инструментов/функций C и C++ ? |