C ++, 205 179 байт
int main(){};static int c=1;
#define v(x) A##x
#define u(x) v(x)
#define z u(__LINE__)
#include <cstdio>
class z{public:z(){++c;};~z(){if(c){printf("%d %o %x",--c,c,c);c=0;}}}z;//
(Немає зворотного нового рядка - при копіюванні перший рядок копії та останній рядок оригіналу повинні збігатися)
В основному, це працює, створюючи послідовність статичних змінних, які при побудові збільшують глобальний лічильник змінних. Потім, при знищенні, якщо лічильник не дорівнює 0, він робить весь свій вихід і встановлює лічильник на нуль.
Для того, щоб визначити послідовність змінних без конфліктів імен, ми використовуємо макрос, пояснений так:
#define v(x) A##x //This concatenates the string "A" with the input x.
#define u(x) v(x) //This slows down the preprocessor so it expands __LINE__ rather than yielding A__LINE__ as v(__LINE__) would do.
#define z u(__LINE__)//Gives a name which is unique to each line.
яка дещо спирається на химерність струнного процесора. Ми використовуємоz багато разів для визначення класів / змінних, які не будуть конфліктувати один з одним при копіюванні на окремі рядки. Більше того, визначення, які мають відбутися лише один раз, розміщуються на першому рядку, який коментується у копіях коду. The#define і#include заяви не хвилюють , що вони отримують повторені, тому не потребує в спеціальній обробці.
Цей код також містить невизначену поведінку у виписці:
printf("%d %o %x",--c,c,c)
оскільки немає точок послідовності, але c є модифікованим та доступним. LLVM 6.0 подає попередження, але компілює його за бажанням - те, що --cоцінюється раніше c. Можна було б, за рахунок двох байтів, додайте інструкцію --c;перед виходами і зміни --cвprintf до c, що б позбутися попередження.
Замінено std::coutз printfекономією 26 байтами завдяки пропозиції мого брата.
1 01 0x1? (Включає префікси)