Comments 36
И да, до сих пор не понимаю, зачем это.Разделитель тысяч в больших числах.
10000000 => 10_000_000
У кого-то компилятор по честному вставит посчитанную константу, а у кого-то виртуальные машины и такие константы придется на ходу вычислять.
JS в зависимости от скоупа константы может сделать оптимизацию и вычислить единожды, но скажем, перезагрузка страницы заставит его выполнить вычисление заново ибо контекст снова будет пересоздан. Есть нюансы, но идея я думаю понятна. Его сосед WASM же вычислит число еще на этапе компиляции и ее можно сразу читать.
Питон вычислит единожды при старте контекста и закэширует в .pyc т.е. и в отличие от JS перезапуск контекста не должен приводить к пересчету. PHP, Ruby та же история.
Ну, а в целом да, вычисления констант обычно супер дешевые и это скорее перфекционизм.
Про вычисляемые константы типа числа секунд в году хорошая идея, но вот, например записывать пределы вида миллиард = 100010001000 не очень, имхо. 1_000_000_000 куда читаемей, особенно если это не функция приобразования гигабайт в байты и обратно, а, например, лимиты операций по счету
protected const YEAR_SECONDS = 60 * 60 * 24 * 365;
Все верно… ну а если год високосный? А астрономы и вовсе верят, что средний тропический год — это 31 556 925 с… Так что простое умножение не всегда спасает. Иногда приходится и константы писать…
Впрочем, с астрономами вообще лучше не связываться, у них даже сутки не всегда равны 60*60*24=86 400 с, т.к. Земля не совсем равномерно вращается ;-)
Ну так заведите константу с названием типа LEAP_DIFFERENCE, AVG_TROPICAL_DIFFERENCE и вычисляйте от базового значения 60 х 60 х 24…
Всяко лучше 31566925 как magic number.
Например, в моей молодости фортран очень медленно работал со строками или с посимвольным выводом на экран (а нам хотелось интерфейс типа Norton Commander-а). Так у нас тогда было нормой некоторые функции на ассемблере переписать. И это практически каждый фортранист в какой-то степени мог. А сейчас вставки на ассемблере хорошо, если каждый сотый напишет. Вот и я уже давно не пишу.
Впрочем, возможно я зря обобщаю на все человечество, и деградация только лично у меня происходит ;-))
Но вообще, когда констант много, то просто для удобства чтения кода гораздо лучше числа писать с разделителями. Чтобы хотя бы в этом месте не терпеть и не напрягаться. В фортране это всегда было доступно (а для кого-то и нормой). Сейчас общая тенденция — чтобы всякие подобные мелкие удобства были доступны в любом языке. Чего в этом плохого? Тем более, что синтаксис в разных языках почти единообразный и даже новичку в языке такая запись понятна?
Ну а не если хочется — так никто не заставляет, можно и не использовать.
Жаль в C такого нет.
Почему бяку? При написании каких-то длинных констант — вполне себе удобно, добавляет читабельности, особенно когда где-то константа с кучей нулей подряд.
#define _
Шутка
Также, пишут, что FORTRAN до версии 77 года вел себя аналогично.
Возможно, я не совсем понял текст по ссылке, но мне непонятно, откуда там взялась цифра Ф-77? Насколько я знаю, по умолчанию фортран до сих пор игнорирует пробелы. Проверил сейчас в компиляторе 2013г (стандарт языка Fortran 2008). И в нем две эти формы записи эквивалентны:
integer :: int_var = 1000000
и
integer :: i nt_v ar = 1 000 000
Возможно, в новых компиляторах есть ключи, позволяющие ограничить такие вольности, но с ходу я что-то ничего не нашел…
А символ подчеркивания в фортране используется, чтобы указать разрядность константы в байтах, например:
13_2! 16-битное целое
-1_8! 64-битное целое
Ну и с системами исчисления все стандартно и лаконично:
int_var=36#3z! присваивает int_var значение 143
Буквы A..Z обозначают цифры от 10 до 35 (соответственно основание может быть не более 36). Ну и упрощенная запись для наиболее частых случаев:
i=B'011'; j='010'B! присваивает i=3, j=2
i=O'011'; j='010'O! присваивает i=9, j=8
i=X'011'; j='010'X; k=Z'0A'! присваивает i=17, j=16, k=15
Даже не знаю, считать ли такую вариативность записи достоинством языка или его недостатком… Если речь идет о клавиатурных комбинациях-синонимах, то вроде бы мы их обычно приветствуем: хочешь, жми Ctrl+C, а хочешь — Ctrl+Ins. А в коде?
20_20 — год, в котором подчеркивание в числовых литералах победило