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;//
(Không có dòng mới nào - khi được sao chép, dòng đầu tiên của bản sao và dòng cuối cùng của bản gốc sẽ trùng khớp)
Về cơ bản, điều này hoạt động bằng cách tạo một chuỗi các biến tĩnh, khi xây dựng, tăng một bộ đếm biến toàn cục. Sau đó, khi hủy, nếu bộ đếm không bằng 0, nó thực hiện tất cả đầu ra của nó và đặt bộ đếm về 0.
Để xác định một chuỗi các biến không có xung đột tên, chúng tôi sử dụng macro được giải thích như sau:
#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.
mà phần nào dựa vào các quirks của bộ xử lý chuỗi. Chúng tôi sử dụngz nhiều lần để xác định các lớp / biến sẽ không xung đột với nhau khi được sao chép vào các dòng riêng biệt. Hơn nữa, các định nghĩa chỉ xảy ra một lần được đặt trên dòng đầu tiên, được nhận xét bằng các bản sao của mã. Các tuyên bố #definevà #includekhông quan tâm rằng chúng được lặp đi lặp lại, vì vậy không cần xử lý đặc biệt.
Mã này cũng có hành vi không xác định trong tuyên bố:
printf("%d %o %x",--c,c,c)
vì không có điểm thứ tự, nhưng c được sửa đổi và truy cập. LLVM 6.0 đưa ra cảnh báo, nhưng biên dịch nó theo ý muốn - --cđánh giá trước đó c. Người ta có thể, tại các chi phí của hai byte, thêm các tuyên bố --c;trước kết quả đầu ra và thay đổi --ctrong printfđểc , trong đó sẽ thoát khỏi cảnh báo.
Thay thế std::coutbằng việc printftiết kiệm 26 byte nhờ một gợi ý của anh tôi.
1 01 0x1? (Bao gồm tiền tố)