C ++, 205 179 byte
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;//
(No trailing newline - saat disalin, baris pertama dari salinan dan baris terakhir dari aslinya harus bersamaan)
Pada dasarnya, ini bekerja dengan membuat urutan variabel statis yang, pada konstruksi, menambah penghitung variabel global. Kemudian, pada penghancuran, jika penghitung bukan 0, ia melakukan semua outputnya dan menetapkan penghitung ke nol.
Untuk mendefinisikan urutan variabel tanpa konflik nama, kami menggunakan makro yang dijelaskan sebagai berikut:
#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.
yang agak bergantung pada kebiasaan prosesor string. Kami menggunakan zbanyak kali untuk mendefinisikan kelas / variabel yang tidak akan saling bertentangan ketika disalin ke baris terpisah. Selain itu, definisi yang harus muncul hanya sekali ditempatkan pada baris pertama, yang dikomentari dalam salinan kode. The #definedan #includepernyataan tidak peduli bahwa mereka bisa diulang, sehingga perlu ada penanganan khusus.
Kode ini juga menampilkan perilaku tidak terdefinisi dalam pernyataan:
printf("%d %o %x",--c,c,c)
karena tidak ada titik urutan, tetapi c dimodifikasi dan diakses. LLVM 6.0 memberikan peringatan, tetapi mengkompilasinya seperti yang diinginkan - yang --cmengevaluasi sebelumnya c. Satu bisa, dengan mengorbankan dua byte, tambahkan pernyataan --c;sebelum output dan perubahan --cdalam printfuntuk c, yang akan menyingkirkan peringatan.
Digantikan std::coutdengan printfpenghematan 26 byte berkat saran kakak saya.
1 01 0x1? (Termasuk awalan)