Приведение в стиле C и читаемость в C ++ - PullRequest
10 голосов
/ 09 декабря 2010

Да, я знаю, что вы не должны использовать приведения в стиле C в C ++, но в некоторых случаях я действительно думаю, что это намного более читабельно, если вы это сделаете, сравните эти два, например:

d = ((double)i * 23.54) / (d + (double)j);

d = (static_cast<double>(i) * 23.54) / (d + static_cast<double>(j));

Какойболее читабельно?

Теперь перейдем к моему основному вопросу.Очевидно, я предпочитаю верхний, но есть один способ сделать его еще более читабельным, на мой взгляд:

d = (double(i) * 23.54) / (d + double(j));

Мой вопрос здесь, будет ли это менее эффективным?Будет ли компилятор создавать больше двойников в этом случае, чем если бы они были преобразованы другими методами, или он достаточно умен, чтобы этого не делать?Это более или менее плохо, чем обычные броски в стиле C?

Ответы [ 6 ]

15 голосов
/ 09 декабря 2010

Они все нечитаемы. Вы должны написать:

d = (i * 23.54) / (d + j);
4 голосов
/ 09 декабря 2010

Компилятор "создаст" точно такое же количество двойников. Нет практической разницы между приведением и конструированием простых числовых типов.

2 голосов
/ 09 декабря 2010

Причина, по которой функции приведения в C ++ длинные и громоздкие, заключается в замысле 1), чтобы показать пользователю, что он, вероятно, что-то делает не так 2) в тех случаях, когда это необходимо, привлечь внимание к этой части кода, кможет делать что-то опасное или нетрадиционное.

2 голосов
/ 09 декабря 2010

Я уже прокомментировал ответ Р. о том, что в этом конкретном случае компилятор может выбрать приведение.

Однако есть случаи, когда вы действительно хотите явное преобразование:

  • Вы хотите предотвратить переполнение или повысить точность
  • Вы хотите проверить правильность конвертации

Повышенное числовое преобразование обеспечивает здесь очень подходящее приведение, намного лучше, чем static_cast: boost :: numeric_cast

  • нет накладных расходов, когда проверка не требуется (т.е. приведение от маленького к большому целому числу)
  • проверка значения во время выполнения при необходимости (т.е. приведение от большого к маленькому или от подписи до без знака)

Это более читабельно, чем static_cast, поскольку подсвечивается сама природа чисел, и намного безопаснее, поскольку предотвращает появление неопределенного поведения (и проблем с переносимостью).

1 голос
/ 09 декабря 2010

ИМХО, static_cast более читабелен, потому что предоставляет читателю информацию о характере приведения.

0 голосов
/ 09 декабря 2010

Я предлагаю вам скомпилировать в сборку (если ваш компилятор поддерживает такую ​​опцию). Например, опция Gnu C ++ -S выведет сборку, чтобы вы могли убедиться сами.

...