1 - Примеры странного кода:
01) a[b] - это то же самое, что и b[a]
02) 'abcd' - это int, у которого нулевой байт - символ d, первый - c и т. д.
03) while (n --> 0) - на самом деле это операторы -- и >
04) Операторы-головастики (унарный минус и инверсия битов):
    -~n == n+1
    ~-n == n-1
05) Триграфы
06) Этого не было на спецкурсе:
    Простой пример использования шаблонов
    Вычисление чисел Фиббоначи на шаблонах в compile-time
    Оптимизация дерева отрезков при помощи шаблонов (ускоряет код, значительно увеличивает размер исполняемого файла. Нормально работает только на ДО размера порядка нескольких тысяч, на 10^5 компилятор вешается).

2 - Как правильно стрелять себе в ногу:
01) Присваивание в условии. Если обернуть условие в if в двойные круглые скобки, ворнинг не кидается!
02) 32ll - это на самом деле (long long)32, а не 3211
03) 1e18 + 1 - это 1e18, потому что 1e18 - это double, и у него не хватает точностию
04) v.size() - 1 писать нельзя, так как v.size() - это беззнаковое число.
05) Приоритеты операций: желательно заключать в скобки битовые операции (&, ^, |, <<, >>) и тернарный условный оператор
06) Модуль из отрицательного числа берётся не так, как вы того ожидаете
07) push_back в vector приводит к тому, что старая ссылка будет указывать на некорректный элемент
08) memset - несколько частых ошибок
09) pow - это название библтотечной функции, и в данном примере вызывается именно она, а не та, которую мы написали
10) При извлечении квадратного корня проверяйте, не извлекаете ли вы его из -EPS
11) На самом деле Segment seg(Point(i), Point(j)) - это прототип функции seg, которая принимает два Point и возвращает Segment.
12) Элементы vector < bool > не плучится читать при помощи cin, так как v[i] - это не bool&, а std::_Bit_reference

3 - Неопределённое поведение
01) Битовый сдвиг на 35 приводит к неопределённому опведению
02) Переполнение знакового типа - тоже UB
    Компилятор считает, что UB не бывает, и убирает условие цикла
03) Выход за границы массива 
04) Порядок выполнения операций
    1 - неоуточняемый порядок
    2 - UB
    3 - (x=x+x++) UB
    4 - (readInt) не UB, но аргументы могут быть вычислены в любом порядке
05) Равные указатели разых типов
06) Разыменвание NULL перед его проверкой на NULL убирает эту проверку на NULL (пример из ядра UNIX)
07) Использование неинициализированной переменной - UB
08) Конкурс на UB в 2012: realloc
09) INT_MIN и -INT_MIN

----------------------------------------------------------------------------------

Неопределённое поведение
 - Неинициализированная переменная
 - Выход за границу массива, разыменование неправильного указателя или NULL
 - Переполнение знаковых типов
 - Битовый сдвиг больше, чем на размер типа
 - Отсутствие return из функции
 - Конструкции вроде (x + x++)

Неуточняемое поведение
 - Порядок вычисления аргументов функции


Ваш код может:
 - Работать правильно
 - Выдать неправильный ответ
 - Упасть
 - Зависнуть
 - (*) По-разному работать со включенными оптимизациями (Release) и без них (Debug)
 - (*) По-разному работать при, казалось бы, незначительных изменениях
 - (*) Работать у вас и в тестирующей системе по-разному

