因为C语言语法格式的特殊性,还诞生了一个C语言乱码大赛,从1984年开始,一直办到现在。在它官网上能看到历年所有的参赛获奖的作品。
官网链接:
- https://www.ioccc.org
- https://github.com/ioccc-src/temp-test-ioccc
这个比赛的目的不是写出最好看,最易懂的代码,而是比赛写出最有创意的最让人难以理解的,最难看懂的C语言代码。
一、作品赏析(1)
比如下面这个经典的获奖作品:
#include <stdio.h> char* a; main(int t, int _, char* a) {return!0 < t ? t < 3 ? main(-79, -13, a + main(-87, 1 - _, main(-86, 0, a + 1) + a)) : 1, t < _ ? main(t + 1, _, a) : 3, main(-94, -27 + t, a) && t == 2 ? _ < 13 ? main(2, _ + 1, "%s %d %d\n") : 9 : 16 : t < 0 ? t < -72 ? main(_, t, "@n'+,#'/*{}w+/w#cdnr/+,{}r/*de}+,/*{*+,/w{%+,/w#q#n+,/#{l+,/n{n+,/+#n+,/#;#q#n+,/+k#;*+,/'r :'d*'3,}{w+K w'K:'+}e#';dq#'l q#'+d'K#!/+k#;q#'r}eKK#}w'r}eKK{nl]'/#;#q#n'){)#}w'){){nl]'/+#n';d}rw' i;# ){nl]!/n{n#'; r{#w'r nc{nl]'/#{l,+'K {rw' iK{;[{nl]'/w#q#n'wk nw' iwk{KK{nl]!/w{%'l##w#' i; :{nl]'/*{q#'ld;r'}{nlwb!/*de}'c ;;{nl'-{}rw]'/+,}##'*}#nc,',#nw]'/+kd'+e}+;#'rdq#w! nr'/ ') }+}{rl#'{n' ')# }'+}##(!!/") : t < -50 ? _ == *a ? putchar(31[a]) : main(-65, _, a + 1) : main((*a == '/') + t, _, a + 1) : 0 < t ? main(2, 2, "%s") : *a == '/' || main(0, main(-61, *a, "!ek;dc i@bK'(q)-[w]*%n+r3#l,{}:\nuwloca-O;m .vpbks,fxntdCeghiry"), a + 1);}
第一眼看上去,这啥嘛,能运行吗?它还真能运行(记得代码保存格式要以.c
结尾),输出了这一堆英文:
翻译一下会发现这竟然还是一首写的不错的诗:
On the first day of Christmas my true love gave to me
a partridge in a pear tree.
On the second day of Christmas my true love gave to me
two turtle doves
and a partridge in a pear tree.
On the third day of Christmas my true love gave to me
three french hens, two turtle doves
and a partridge in a pear tree.
On the fourth day of Christmas my true love gave to me
four calling birds, three french hens, two turtle doves
and a partridge in a pear tree.
On the fifth day of Christmas my true love gave to me
five gold rings;
four calling birds, three french hens, two turtle doves
and a partridge in a pear tree.
On the sixth day of Christmas my true love gave to me
six geese a-laying, five gold rings;
four calling birds, three french hens, two turtle doves
and a partridge in a pear tree.
On the seventh day of Christmas my true love gave to me
seven swans a-swimming,
six geese a-laying, five gold rings;
four calling birds, three french hens, two turtle doves
and a partridge in a pear tree.
On the eigth day of Christmas my true love gave to me
eight maids a-milking, seven swans a-swimming,
six geese a-laying, five gold rings;
four calling birds, three french hens, two turtle doves
and a partridge in a pear tree.
On the ninth day of Christmas my true love gave to me
nine ladies dancing, eight maids a-milking, seven swans a-swimming,
six geese a-laying, five gold rings;
four calling birds, three french hens, two turtle doves
and a partridge in a pear tree.
On the tenth day of Christmas my true love gave to me
ten lords a-leaping,
nine ladies dancing, eight maids a-milking, seven swans a-swimming,
six geese a-laying, five gold rings;
four calling birds, three french hens, two turtle doves
and a partridge in a pear tree.
On the eleventh day of Christmas my true love gave to me
eleven pipers piping, ten lords a-leaping,
nine ladies dancing, eight maids a-milking, seven swans a-swimming,
six geese a-laying, five gold rings;
four calling birds, three french hens, two turtle doves
and a partridge in a pear tree.
On the twelfth day of Christmas my true love gave to me
twelve drummers drumming, eleven pipers piping, ten lords a-leaping,
nine ladies dancing, eight maids a-milking, seven swans a-swimming,
six geese a-laying, five gold rings;
four calling birds, three french hens, two turtle doves
and a partridge in a pear tree.
圣诞节的第一天,我的真爱给了我
梨树上的一只鹧鸪。
在圣诞节的第二天,我的真爱给了我
两只斑鸠
梨树上的一只鹧鸪。
在圣诞节的第三天,我的真爱给了我
三只法国母鸡,两只斑鸠
梨树上的一只鹧鸪。
在圣诞节的第四天,我的真爱给了我
四只会叫的鸟,三只法国母鸡,两只斑鸠
梨树上的一只鹧鸪。
在圣诞节的第五天,我的真爱给了我
五枚金戒指;
四只会叫的鸟,三只法国母鸡,两只斑鸠
梨树上的一只鹧鸪。
在圣诞节的第六天,我的真爱给了我
六只鹅,五个金戒指;
四只会叫的鸟,三只法国母鸡,两只斑鸠
梨树上的一只鹧鸪。
在圣诞节的第七天,我的真爱给了我
七只天鹅游泳,
六只鹅,五个金戒指;
四只会叫的鸟,三只法国母鸡,两只斑鸠
梨树上的一只鹧鸪。
在圣诞节的第八天,我的真爱给了我
八个女仆一个挤奶,七只天鹅一个游泳,
六只鹅,五个金戒指;
四只会叫的鸟,三只法国母鸡,两只斑鸠
梨树上的一只鹧鸪。
在圣诞节的第九天,我的真爱给了我
九个女人跳舞,八个女仆挤奶,七只天鹅游泳,
六只鹅,五个金戒指;
四只会叫的鸟,三只法国母鸡,两只斑鸠
梨树上的一只鹧鸪。
在圣诞节的第十天,我的真爱给了我
十个领主a跳跃,
九个女人跳舞,八个女仆挤奶,七只天鹅游泳,
六只鹅,五个金戒指;
四只会叫的鸟,三只法国母鸡,两只斑鸠
梨树上的一只鹧鸪。
在圣诞节的第十一天,我的真爱给了我
十一个风笛手在吹笛,十个领主在跳跃,
九个女人跳舞,八个女仆挤奶,七只天鹅游泳,
六只鹅,五个金戒指;
四只会叫的鸟,三只法国母鸡,两只斑鸠
梨树上的一只鹧鸪。
在圣诞节的第十二天,我的真爱给了我
十二个鼓手打鼓,十一个风笛手吹笛,十个领主跳跃,
九个女人跳舞,八个女仆挤奶,七只天鹅游泳,
六只鹅,五个金戒指;
四只会叫的鸟,三只法国母鸡,两只斑鸠
梨树上的一只鹧鸪。
这首诗看起来挺长的,但代码又好像挺短的,是不是还挺有意思的~
这么复杂的代码,怎么去把它看明白呢?直接用眼睛瞪可能就是有点不太聪明的样子,这个比赛的目的就是把代码写的越乱,越不是人类能看懂,才能越可能获奖,如果我一眼就能瞪出来,那它就不能获奖了。
所以这个时候,我们可以把ChatGPT这种大预言模型请出来让他们帮忙。
当前能用的有OpenAI的ChartGPT4和3.5、阿里的通义千问、百度的文心一言、腾讯的腾讯混元等等,这几个我都用了试了,最后惊喜的发现,他们都能够毫不犹豫的立刻给出优化的代码,我自信的运行了一下发现没一个能跑通的。
相对来说,效果最好的是在vscode中的通义灵码,好歹输出了“On the”,完胜其他几款模型:
但最诚实的还应该是微软的Copilot,它就诚实又委婉的回答了“我不会”:
看来人工智能还是斗不过刁钻的程序员们,但是代码的执行逻辑,这几个大模型都能说的比较清楚,判断的也比较准,都是用复杂的递归去实现了这个功能。
所以说,我们再回过头来看,这些乱码作品,是不是很有它获奖的充分理由。
再后面我有测试了很多次,有几次是成功了的,但优化的代码可读性也并不理想,比如下面这个:
#include <stdio.h> char* message; int interpret(int t, int _, char* message) { return !0 < t ? t < 3 ? interpret(-79, -13, message + interpret(-87, 1 - _, interpret(-86, 0, message + 1) + message)) : 1, t < _ ? interpret(t + 1, _, message) : 3, interpret(-94, -27 + t, message) && t == 2 ? _ < 13 ? interpret(2, _ + 1, "%s %d %d\n") : 9 : 16 : t < 0 ? t < -72 ? interpret(_, t, "@n'+,#'/*{}w+/w#cdnr/+,{}r/*de}+,/*{*+,/w{%+,/w#q#n+,/#{l+,/n{n+,/+#n+,/#;#q#n+,/+k#;*+,/'r :'d*'3,}{w+K w'K:'+}e#';dq#'l q#'+d'K#!/+k#;q#'r}eKK#}w'r}eKK{nl]'/#;#q#n'){)#}w'){){nl]'/+#n';d}rw' i;# ){nl]!/n{n#'; r{#w'r nc{nl]'/#{l,+'K {rw' iK{;[{nl]'/w#q#n'wk nw' iwk{KK{nl]!/w{%'l##w#' i; :{nl]'/*{q#'ld;r'}{nlwb!/*de}'c ;;{nl'-{}rw]'/+,}##'*}#nc,',#nw]'/+kd'+e}+;#'rdq#w! nr'/ ') }+}{rl#'{n' ')# }'+}##(!!/") : t < -50 ? _ == *message ? putchar(31[message]) : interpret(-65, _, message + 1) : interpret((*message == '/') + t, _, message + 1) : 0 < t ? interpret(2, 2, "%s") : *message == '/' || interpret(0, interpret(-61, *message, "!ek;dc i@bK'(q)-[w]*%n+r3#l,{}:\nuwloca-O;m .vpbks,fxntdCeghiry"), message + 1); } int main(int argc, int argv, char* input) { return interpret(argc, argv, input); }
二、作品赏析(2)
这里还有一个更离谱的,56行,还摆了个造型:
#define So long #define R rand() #include <math.h> #include <X11/Xlib.h> #define T(i,F) ((So long)(i)<<F) #define O(c,L,i) c*sin(i)+L*cos(i) #define y(n,L) for(n=0; n<L 3; n++) #define P(v,L) d=0; y(l,)d+=T(L*l[v],l*20); #define X(q) q>>10&63|q>>24&4032|q>>38&258048 char J[1<<18]; int G[W*p],_,k,I=W/4+1,w=p/4+1; float C,B,e; unsigned So long A,n,d, t,h,x, f,o,r,a,l,L,F,i,s,H=1<<18,b=250,D[1<<14],z[W*p],q =0x820008202625a0;main(){Display *j=XOpenDisplay(0);Window u=XCreateSimpleWindow (j,RootWindow(j,0),0,0,W,p,1,0,0);XImage *Y=XCreateImage(j,DefaultVisual(j,0),24 ,2,0,(char*)G,W,p,32,0); XEvent M; for(XMapWindow(j,u); XSelectInput( j,u,1)&&a- 65307; ){ if(!H){ if(XCheckWindowEvent(j,u,1,&M)){ a=XLookupKeysym(&M.xkey,0);*( a&1?&C:& B)-=(.05 -a/2% 2* .1)*!(a- 1& 4092^ 3920);a+ 2&0xfe0^ 0xfc0||( s=a+2&31 ); }else { y(k,p+ ){ F=k%w* 4|k/w; float a[6],S=(F-p /2.) /p; y(_,W+){ i=_%I*4|_/I; if( F<p&i<W){ o=1; L= i+F*W;if (l=i&3); else{ l=F&3; o=W ; } h=z[L-o*l]; f =z[L+(4- l)*o]; t =F-p/2||i-W/2; r =h^f; if(!l| !t|( int)r|(! (h- 3&3) &&258063&r>>38)) { float V=(i-W/2. )/p,U=O( S,1,B),m =32768,Q=m; a[4] =O(-1,S,B); a[3]= O(U,V,C) ; a[5]=O (-V,U,C); P((a+3 ),s*42); t||(A=d) ;f=0;y(n ,){float N=a[n+3], E=1024 /fabs(N); b= N<0; float K= (((q>>20 *n)^~-b)+!b&1023 )/1024.; y(d,)a[d ]=a[d+3] *E; a[n] =round(a[n]); P( a,K); i=q+d; P(a, 1); e=E* K; for(; e<m; i+=d){ l=X(i); t=r=l^(l^l-( 1<<6*n)) &63<<6*n ; if(b){ r=l; l=t; } if(J[r])l=r ; if(t=J [l]){x=( n-1)?(i|i>>40)&1023|i>>8&4190208 |4194304 :i&1023| i>>28&4190208|(b^l==r)<<23; if(h =D[(x>>6 &0xf|x>> 14&0x3f0)+t*768]){ o=h; f=n|l*4| x<<32; m =e; } if (t==8&e<Q)Q=e; } e+=E; } }b=(255 -((f&3)+ 2)%3*51) *(1-m/32768); o=o*b>>8; G[L]=o>> 32<<8|o& 16711935 ; z[L]=3*(Q<=m)|f|b<<56; } else{ d=l*(f<< 8>>40)+( 4-l)*(h<<8>>40)>>2&16774143; o=D [(d>> 6& 15|d>>14 &1008)+J[(int)h/4]*768]*(b=h>>56 )>>8; G[ L]=o>>32 <<8 | o& 16711935 ; z[L]=( int) h|d <<32|b<< 56; } }} } q +=A; XPutImage (j, u+0, DefaultGC (j,J[X(q )]=0),Y, 0,0,0,0, W,p); }} else{ L= --H/768; J[H] =R% 16*(R%4< abs((H>> 6&63)-32 )+abs((H >>12&63) -32)-3); i=H &15; F=H %768 >>4; if( L<16){if (L-1|!(R %3))b=R% 96^255; l=i*i*3+i*81/4&3; a=L>3?L-8?L-5?9858122:12365733-488848*((i+F/4*4)%8&&F% 4):R%2*5298487:3352537*L*L-14202379*L+19205553; if(L==4)if(F<l+18)a=6990400;else if(l>F-19)b*=0.7; if(L==3){ if((i-1&15)<14&(F-1&15)<14&!(F&16)){ a=12359778; _=7 -i; k=7-F%16; _^=_>>31; k^=k>>31; b=196-R%32+(k>_?k:_)%3*42;} else{ b*=1+R%2*(.5 -(i&1)); } } D[H]=(a&16711935|(a&65280)<<24)*(b>>(F>>5))>>8&0xff00ff00ff; } } }}
编译(make)一下,会有一些编译警告,不用管它,直接运行:
没错,就这么一个56行的“小程序”,硬是给我们整了个1G游戏效果的活,一个类似于3D的迷宫的小游戏,还可以通过键盘方向键调节反向,并且控制加速和减速。
仔细看代码会发现,里面用了一个#include <X11/Xlib.h>
这个库,一切动画效果也都是基于这个库实现的,但不得不说,还是很腻害。
三、其他作品
类似这种优秀的获奖作品还有很多,我这里整理了几个很好玩有趣的作品,把他们代码的执行逻辑梳理(ChatGPT解读)了放在对应代码的下面,每一个代码都很短,直接可以编译运行,很方便的能看到他的执行效果。
1. 神奇的PI
#include<stdio.h> /******** SpigotQuine -- usage: ./spigot [pi or e] ********/
char* s = "G1%%xJ{;Q7wunmuGuu%%uu#include<stdio.h>/*Spigot_Quine*/#include<stdli"
"b.h>/*_IOCCC2012_*/int*e," "i,j,k,n" ";char*q" ",*a,*d,*z,*p=%s%c;"
"int" "%cmain(){a=calloc(" "1,1e4+n*2);;for(*"
"a=\0@3,z=d=a+n+1,j=n*8-7;" "k=0,j-1" ";j-=2){" "for(a[1]+=2;--z-a;"
"*z=k%%10,k/=10)k+=j/2**z;;for(;k=k%%j*" "10+*++z,z<d;)*z=k/" "j;;\0@2,z="
"d=a+n*2,*z=1,j=0;++j<n;){for(;k=k%%" "j*10+*z,a-z;*z" "--=k/j)a+"
"+;for(k=0;z-d;*a--=k%%10,k/=10)k+" "=*++z+*a\0" "@;}d+=spr"
"intf(q=d-20,p,p,34,32,n+1)+2;;;;" "for(n=n*2" "0-400;k<n"
";++k%%n?j=!puts(" "d):(d[j]="
"47,d++,d[j-2" "]=42),k%%"
"20<1?puts(d" "-1),a++:0"
"){for(i=-1" ";i++<32;!"
"*z?q[662]" "=0,z=q+207:" "*z+z[1]<6" "5?z+=11:*"
"z==34?p=0" ":0)d[i]=((k/2" "0-1?275*q[" "*a+10]-8*"
"q[*a+0]-8" ":128)>>(i/11+k/" "4%%5*3))&1?k" "/3*!j&&p?"
"j=34:(j=" "i+1,*z++):32;k/3*" "j--&&p?d[z--,j]=3" "4:0;}}int"
"*y,n=%d;/*..~", * f = "nnLa5~z23~|22t$q(s82r&q(s82q'q(s8;q(s8;q(s8:" "r(s8:r(s8:"
"q)s89r)sLr#t+" "sLx,uJw-yGu/wnnnU", * g = "nnLa<z::t$u88t(u67t*u57s,t56t,t56~v56"
"tF6tF6tF8t1p" "Nu/qOv+rS}Xxnng"; int main(int m, char** v) {char a[2012], b[2012], * p = a, * r = m > 1 && *v[1] == 'e' ? g : f, * q = b, * t = r;; sprintf(a, "%s%s%s", s, r == g ? s + 281 :s + 168, s + 386); sprintf(b, a + 22, a, 34, 32, 24); for (sprintf(a, "%.33s/*%.28s*/%.3""3s/*%.28s*/%" ".33s\"%s*/", b, b + 66, b + 33, b + 76, b + 66, b + 99); *r; r++) {; for (m = 0; m++< (*r - 34) % 77; *q++ = *r > 111 ? 32 : *p++)(q - b) % 66 < 1 ? *q++ = 10 : 0; *r - 110 && *r - 126 && r - t < (t - g ?62 : 45) ? *q++ = 34, ((q - b) % 66 < 1 ? *q++ = 10, *q++ = 34 : 0) : 0;}*q = 0; puts(b + 1);
}/*IOCCC2012*/
上述代码可以直接在VS中编译执行,执行效果是输出一个类似ASCII排版的pi:
但是这还没完,仔细观察它输出的所有字符,会发现这其实还是一段代码,再将其拷贝到VS中可以直接执行,输出结果是3.14样式的ASCII图案:
喂!这个作者,接招:
2. 跳舞的“甜甜圈”
k;double sin(),cos();main(){float A=0,B=0,i,j,z[1760];char b[1760];printf("\x1b[2J");for(;;){memset(b,32,1760);memset(z,0,7040);for(j=0;6.28>j;j+=0.07)for(i=0;6.28>i;i+=0.02){float c=sin(i),d=cos(j),e=sin(A),f=sin(j),g=cos(A),h=d+2,D=1/(c*h*e+f*g+5),l=cos (i),m=cos(B),n=s\
in(B),t=c*h*g-f* e;int x=40+30*D*
(l*h*m-t*n),y= 12+15*D*(l*h*n
+t*m),o=x+80*y, N=8*((f*e-c*d*g)*m-c*d*e-f*g-l *d*n);if(22>y&&y>0&&x>0&&80>x&&D>z[o]){z[o]=D;;;b[o]=".,-~:;=!*#$@"[N>0?N:0];}}/*#****!!-*/printf("\x1b[H");for(k=0;1761>k;k++)putchar(k%80?b[k]:10);A+=0.04;B+=0.02;}}/*****####*******!!=;:~~::==!!!**********!!!==::-.,~~;;;========;;;:~-...,--------,*/
直接将上述代码保存为donut.c,编译命令:gcc -o donut donut.c -lm
,执行:./donut
执行效果:
- 出处:https://www.a1k0n.net/2006/09/15/obfuscated-c-donut.html
- 原理讲解:https://www.a1k0n.net/2011/07/20/donut-math.html
3. 462个字节实现ASCII动画
c,p,i,j,n,F=40,k,m;float a,x,y,S=0,V=0;main(){for(;F--;usleep(50000),F?puts(
"\x1b[25A"):0)for(S+=V+=(1-S)/10-V/4,j=0;j<72;j+=3,putchar(10))for(i=0;x=S*(
i-27),i++<73;putchar(c[" ''\".$u$"]))for(c=0,n=3;n--;)for(y=S*(j+n-36),k=0,c
^=(136*x*x+84*y*y<92033)<<n,p=6,m=0;m<8;k++["<[\\]O=IKNAL;KNRbF8EbGEROQ@BSX"
"XtG!#t3!^"]/1.16-68>x*cos(a)+y*sin(a)?k=p,p="<AFJPTX"[m++]-50:k==p?c^=1<<n,
m=8:0)a=(k["O:85!fI,wfO8!yZfO8!f*hXK3&fO;:O;#hP;\"i[by asloane"]-79)/14.64;}
将上述代码保存为yanim.c,编译命令:gcc -o yanim yanim.c -lm
,执行:./yanim
执行效果:
出处及讲解:https://www.a1k0n.net/2011/06/26/obfuscated-c-yahoo-logo.html
4. 一行代码的火焰效果
b[2080];main(j){for(;;){printf("\x1b[H");for(j=1;j<2080;j++)b[j]=j<2000?(b[j+79]+b[j+80]+b[j]+b[j-1]+b[j+81])/5:rand()%4?0:512,j<1840?putchar((j%80)==79?'\n':" .:*#$H@"[b[j]>>5]):0;usleep(20000);}}
将上述代码保存为fire.c,编译命令:gcc -o fire fire.c
,执行:./fire
执行效果:
出处:https://www.a1k0n.net/2007/08/24/obfuscated-c-fire.html
5. 一朵“I love you”
#include<stdio.h> main() { int i,l,u; char *ilu="STILL THINKING HOW I DID IT?\ !r/g.g#i.g/g!j/g.g#i.g/g+g!q0g!mag/h(g!m]g+g!p<g!h`i!l`g!k`g!h\ <g+g!p}g!i}g!i}g!h0g!g]g}g!g}h`g!h}g+g!p<g!h`g}g`g!h}g`h]g`g0g}\ g0g!g}g`g!h<g+g!q]g!n`g!o0g+g!r]g`h!g]g`g0h!g]g}g!g}g!j0g+g!n`g!\ i0g!h}g!g}g!g]g`g0g]g`g0g!h0g(g+g!m}g!g]g!h]g0g`g0g]g!n0g(g+g!m]g\ `g]g}g!g0g!g`h!gag]g!j0g(g+g!p]g0g`g0g`h]g!hag]g0g(g!k/g.h>g(g0g\ g]g+g!i`j-g`h0g`h-g`k-g`l*g0g!i0g|gg~i+g!i.g-g.k-g.h]g.h-g.k-\ g.i-g]g(g.g(g!g|hg~h+g!q`h0g]g`g!r(g.h>g/g]g~g0g+g!p0g`g0g!g\ }g]h+g!u]g0g"; for(i=28;l=ilu[i++];) for(u=(*(ilu+++i)-((1<<6)+(1<<5)+(1<<2)+(1<<1)));u--;) putchar(!((l-11)^(1<<5))?l-1-(1<<5):l-1); }
直接在VS中编译执行,输出:
6. 输出程序生成时间
main(_) { _ ^ 448 && main(-~_); putchar(--_ % 64 ? 32 | -~7[__TIME__ - _ / 8 % 8][">'txiZ^(~z?" - 48] >> ";;;====~$::199"[_ * 2 & 8 | _ / 64] / (_ & 2 ? 1 : 8) % 8 & 1 : 10); }
直接在VS中编译执行,输出程序生成时候(编译)的时间:
7. 印度地图
#include<stdio.h> int main() { int a, b, c; for (b = c = 10; a = "- FIGURE?, UMKC,XYZHello Folks,\TFy!QJu ROo TNn(ROo)SLq SLq ULo+UHs UJq TNn*RPn/QPbEWS_JSWQAIJO^\NBELPeHBFHT}TnALVlBLOFAkHFOuFETp\HCStHAUFAgcEAelclcn^r^r\\tZvYxXy\T|S~Pn SPm SOn TNn ULo0ULo#ULo-W\Hq!WFs XDt!"[b++ + 21]; ) for (; a-- > 64; ) putchar(++c == 'Z' ? c = c / 9 : 33 ^ b & 1); return 0; }
直接在VS中编译执行,输出:
除了C语言乱码大赛,还有一个C语言有意思的玩法是,把一段代码,执行后输出显示的结果,就完完全全是源代码本身,也很有趣。
8. 程序代码与输出完全一样
如果让你写一个程序,让程序执行后输出的内容,和程序本身代码一模一样。你先想一想怎么实现,是不是还挺迷糊的。看下面这个:
#include <stdio.h> char* s = "#include <stdio.h>%cchar*s=%c%s%c;%cmain(){printf(s,10,34,s,34,10,10);}%c"; main() { printf(s, 10, 34, s, 34, 10, 10); }
上面代码执行的结果,和程序本身代码一模一样。