Упс! Что-то пошло не так!
Почему-то возникла ошибка( Попробуй перезагрузить страницу!
ВЫбери свой путь роста
CLOVERI CLUB
В различных языках программирования существуют определенного рода хитрости/нестандартные решения или же хаки, которые помогают заметно упростить работу с кодом. Наша тема повествования будет завязана именно на этом. В статье мы осветим такие моменты, как:

Макросы для кодера С++

Небольшие, но интересные хаки

Полезные приемы в написании кода

Наглядный пример нестандартного написания кода



1. Задействование макросов в работе

Показывать интересные макросы мы будем на примере Си и С++ (но что-то полезное вынести для себя могут не только программисты C++, но и носители других языков программирования), но не станем говорить об их сути, а сразу перейдем к наглядным примерам.

Первый пример позволяет модифицировать синтаксис своих программ путем использования макросов. Помимо того, что у нас появляется возможность повысить уровень кода – мы можем упростить осуществление некоторых задач. Допустим, нашей задачей является использование в программе конструкции foreach, однако, Си не имеет данную конструкцию, но ее довольно просто можно создать через макрос:



Предположив, что команда С++ содержит связный список с заполненными узлами, можно задействовать LIST_FOREACH. При желании вы можете выработать свою тактику работы.

Другим рядом макросов будут директивы препроцессора.

Ifdefиспользуется при создании заголовочных файлов/условной компиляции частей программы при определенных условиях:





Макрос Defineзадействуется при определении констант, однако, не советуем включать его в C++, ведь const тут будет являться полноценной константой, нежели defineи поэтому рекомендуется брать именно эту команду.

2. Небольшие, но полезные хаки

Данный раздел начнем с приема быстрого floor (float):



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

Второй пример - подсчет битов, который является популярным, но все же скажем и о нем.



3. Необычные приемы при работе на C++

1) Смело задействуйте в коде typedef



Это заметно улучшит ваш код.

2) В случае, если вы занимаетесь работой с числом П, то для наиболее точного его обозначения (если конечно техническое задание того требует и у вас заранее не прописано это значение) – можете использовать const double pi = 2 * acos (0.0)

3) Если затрагивать алгоритмизацию, то можем посоветовать не частить с использованием INT_MAXили вообще от нее отказаться. Например, в алгоритмах Флойда-Уоршелла используются крайне большие значения и использование данной команды приведет к элементарному переполнению, что нам не нужно.

Но что же тогда брать в качестве замены? Ответ: int oo = 0x3f3f3f3f. Данный код подойдет под большой диапазон задач в работе с числами, особенно те, которые в других случаях приводят к переполнению. Также, открывается в полной мере функция memset(array, oo, sizeof(array)); (ведь все байты равны)

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

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

4. Пример необычного кода

Данный пример заключается не то чтобы в сложности решения какого-то исключения или чего-то подобного.

Сие назвали «магической константой»0x5f3759df. Заранее покажем то, как алгоритм был реализован:



Кратко объясним прием. Сначала функция берет какое-то число, например, в формате floatи затем интерпретирует в целочисленный тип переменных, затем происходит аппроксимация необходимого результата:



Как ни странно, то, что мы получили еще не является результатом, а просто переведенной цифрой, потому вы должны выполнить преобразование из целочисленного типа обратно во float:



Затем для повышения уровня аппроксимация мы используем итерацию по методу Ньютона:



Все – результат получен. Вот так и выполняется прекрасная аппроксимация команды выделения обратного корня. Сразу скажем, что все это отсылается к правилам высшей математике, поэтому, если что-то неясно, то советуем обратиться именно туда. Само объяснение задействует не один десяток формул и для того, чтобы вы убедились в этом, вот как будет выглядеть вычисление стандартного корня числа (учтите, что число П= 0,5):



Но как это будет выглядеть в коде?



Работает ли это? Абсолютно!

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







Во всем этом примере, несмотря на то, что он был назван «магическим», все вполне обоснованно математическими принципами и формулами. Мы же вывели для себя экзотическое преобразование floatв intинтерпретацией одного и того же набора бит. Это не хак или ошибка, которая позволила сделать открытие, а вполне себе логичное действие, пусть и нестандартное.

Made on
Tilda