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-стиля?

Ответ 1

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

Ответ 2

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

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

Ответ 3

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

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

  • вы хотите предотвратить переполнение или повысить точность.
  • вы хотите проверить правильность преобразования

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

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

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

Ответ 4

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

Ответ 5

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

Ответ 6

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