C/C++

Язык С++ : есть ли разница между этими двумя операциями? 1) int m = (int)n; 2) int m = int(n).

Лабеан Нофелет
Лабеан Нофелет
96 935
В первом случае явное приведение к целому типу без знака с возможной потерей точности в стиле языка программирования C.

Во втором случае то же самое действие достигается в стиле языка C++. Так как в этом языке все типы хотят быть объектами, для встроенных типов это также работает как и конструктор копирования в составных типов (class и struct).

Разницы в результате при этом никакой!

Ввиду того, что возможная потеря точности может в ряде случаев приводить к трудноуловимым ошибкам, в языке C++ были введены абсолютно безобразные конструкции явного приведения, в том числе и для приведения типов, как было указано выше. Синтаксис такого приведения следующий:

int m = static_cast<int>(n);

Такая «угловатая» конструкция позволяет легко находить в коде строки с явным приведением, воспользовавшись автоматизацией поиска в IDE по ключевому слову static_cast
Вадим Воинов
Вадим Воинов
67 797
Лучший ответ
Лабеан Нофелет А они чем безобразные?
А есть ли разница между "Павел Коржов" и "Коржавел Павлов"? +_-
Тимур Амагов
Тимур Амагов
37 945
Лабеан Нофелет Я не Павел Коржов, а я Павел А. Коржов! Не путайте!
1. Это не (!) с++ преобразование, это строго Сишные конструкции, которые не следует применять в плюсах вообще, в плюсах для этого есть *_cast...
2. Преобразования должны быть эквивалентны (см п. 2 https://en.cppreference.com/w/cpp/language/explicit_cast ) , но имхо компилятор может внести свои коррективы. Второй способ, называемый функциональной нотацией преобразования типа ограничен тем, что нельзя откастовать, например, к указателю на int, .т. е. int *(n) невалиден, в отличие от (int *)n;
В первой операции использовано приведение типа памяти м к н. Во второй операции полный фиесто! Подучи приоритеты операндов, скобки это круто, меняют приоритеты но не в таких конструкциях
int(n) нельзя а (int)n можно

Похожие вопросы