C ++, 205 179 bayt
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;//
(Sondaki yeni satır yok - kopyalandığında, kopyanın ilk satırı ve orijinalin son satırı aynı olmalıdır)
Temel olarak, bu, inşaatta global değişken sayacını artıran bir statik değişkenler dizisi yaparak çalışır. Daha sonra, yıkımda, sayaç 0 değilse, tüm çıktısını yapar ve sayacı sıfıra ayarlar.
Ad çakışması olmayan değişken dizisini tanımlamak için, aşağıda açıklanan makroyu kullanırız:
#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.
Bu da biraz dize işlemcisinin tuhaflıklarına güveniyor. z
Ayrı satırlara kopyalandığında birbirleriyle çakışmayacak sınıfları / değişkenleri tanımlamak için birçok kez kullanıyoruz . Ayrıca, sadece bir kez yapılması gereken tanımlar, kodun kopyalarında yorumlanan ilk satıra yerleştirilir. #define
Ve #include
tablolar hiçbir özel işlem gerekir, onlar tekrarlanan olsun umrumda değil.
Bu kod aynı zamanda ifadedeki tanımsız davranışları da içerir:
printf("%d %o %x",--c,c,c)
Sıralama noktaları olmadığından, c değiştirilir ve erişilir. LLVM 6.0 bir uyarı verir, ancak daha --c
önce değerlendirdiği şekilde istendiği gibi derler c
. Bir, iki bayt pahasına, deyimi ekleyebilirsiniz --c;
çıkışları ve değişiklikten önce --c
de printf
karşı c
uyarı kurtulmak istiyorum.
Ağabeyimin önerisi sayesinde 26 bayt tasarruf std::cout
ile değiştirildi printf
.
1 01 0x1
mu? (Önekleri içerir)