A. 请问:这道题怎么做c语言
下面这段代码即为第19届IOCCC(国际混乱C语言代码大赛)优胜作品:“A clock in one line”。
main(_){_^448&&main(-~_);putchar(--_%64?32|-~7[__TIME__-_/8%8][">'txiZ^(~z?"-48]>>";;;====~$::199"[_*2&8|_/64]/(_&2?1:8)%8&1:10);}
输出结果如下:(当前时间)
!! !!!!!! !! !!!!!! !! !!!!!!!! !! !! !! !! !! !! !!!! !! !! !! !! !! !! !!!! !!!!!! !! !! !! !! !! !!!!!!!! !! !! !! !! !! !!!! !! !! !! !! !! !!!! !!!!!! !! !! !! !!!!!!
它究竟是如何做到的呢?下面为你解读:
首先,将这段代码格式化:
main(_) {_^448 && main(-~_);putchar(--_%64? 32 | -~7[__TIME__-_/8%8][">'txiZ^(~z?"-48] >> ";;;====~$::199"[_*2&8|_/64]/(_&2?1:8)%8&1: 10);}
引入变量:
main(int i) {if(i^448)main(-~i);if(--i % 64) {char a = -~7[__TIME__-i/8%8][">'txiZ^(~z?"-48];char b = a >> ";;;====~$::199"[i*2&8|i/64]/(i&2?1:8)%8;putchar(32 | (b & 1));} else {putchar(10); // newline}}
根据补码的规则,可得-~i == i+1,所以:
main(int i) {if(i != 448)main(i+1);i--;if(i % 64 == 0) {putchar('\n');} else {char a = -~7[__TIME__-i/8%8][">'txiZ^(~z?"-48];char b = a >> ";;;====~$::199"[i*2&8|i/64]/(i&2?1:8)%8;putchar(32 | (b & 1));}}
另外,因为C语言中a[b]等同于b[a],同时在运用 -~=1+ 规则,可得:
main(int i) {if(i != 448)main(i+1);i--;if(i % 64 == 0) {putchar('\n');} else {char a = (">'txiZ^(~z?"-48)[(__TIME__-i/8%8)[7]] + 1;char b = a >> ";;;====~$::199"[(i*2&8)|i/64]/(i&2?1:8)%8;putchar(32 | (b & 1));}}
将递归转换成循环,同时再做简化:
// please don't pass any command-line argumentsmain() {int i;for(i=447; i>=0; i--) {if(i % 64 == 0) {putchar('\n');} else {char t = __TIME__[7 - i/8%8];char a = ">'txiZ^(~z?"[t - 48] + 1;int shift = ";;;====~$::199"[(i*2&8) | (i/64)];if((i & 2) == 0)shift /= 8;shift = shift % 8;char b = a >> shift;putchar(32 | (b & 1));}}}
这样每次迭代会输出一个字符,每第64个字符会输出新的一行。
另外,它还使用数据表来设定输出形式,决定输出的是字符32(即字符空格)还是字符33(即字符 ! )。第一个表“>'txiZ^(~z?”是一组10位图,描述每个字符的外观;第二个表“;;;====~$::199”的作用是,从位图中选择合适的位元来展示。
第二个表
我们先检查一下第二个表,“int shift = ";;;====~$::199"[(i*2&8) | (i/64)];”其中 i/64是行数(从6到0);而 i*2&8 当且仅当i为4、5、6、7mod8时为8。
“if((i & 2) == 0) shift /= 8; shift = shift % 8”选择表的高8位(i%8=0、1、4、5)或者低8位(i=2、3、6、7)值。因此转换表最终看起来是这个样子:
row col val6 6-7 06 4-5 06 2-3 56 0-1 75 6-7 15 4-5 75 2-3 55 0-1 74 6-7 14 4-5 74 2-3 54 0-1 73 6-7 13 4-5 632-3 53 0-1 72 6-7 22 4-5 72 2-3 32 0-1 71 6-7 21 4-5 71 2-3 31 0-1 70 6-7 40 4-5 40 2-3 30 0-1 7
或者显示为表格的形式:注意:作者在表格的前两位使用了null terminator。(真狡猾!)
第一个表
__TIME__是预处理器定义的特殊的宏,它能扩展为一个字符串,内容为预处理器运行的时间,格式为“HH:MM:SS”,刚好占8个字符。注意:数字0-9的ASCII值为48-57,“:”的ASCII值为58。而每行输出64个字符,因此__TIME__ 的每个字符有8个字符的空间。
“7 - i/8%8”是当前正在输出的 __TIME__ 的索引(其中“7-”是必须的,因为我们从 i 开始向下遍历)。因此 t 即 __TIME__要输出的字符。
a的值取决于t,对应关系如下:
0 001111111 001010002 011101013 011110014 011010105 010110116 010111117 001010018 011111119 01111011: 01000000
每个数字都是一个位图,描述7段显示的字符。又因为是7位ASCII,所以高位会被清除,所以7位永远是空格,所以第二个表是这个样子:
00005511 5511 5511665522 3322 33444433
举个例子,4即01101010(1、3、5、6位显示),输出如下:
----!!--!!--!!--!!--!!--!!!!!!------!!------!!------!!--
理解了吗?现在我们再对输出做一些调整:
0011 5511 556622 3322 3344
可以编码为“?;;?==? '::799\x07”。
出于美观考虑,我们把对64位做一些修改(因为输出仅使用低6位,所以不会受到影响),于是就变成了“?{{?}}?gg::799G”(注意:第8位并没有被使用,因此我们还可以做更多的衍生创作)。
现在代码就变成了:
main(_){_^448&&main(-~_);putchar(--_%64?32|-~7[__TIME__-_/8%8][">'txiZ^(~z?"-48]>>"?{{?}}?gg::799G"[_*2&8|_/64]/(_&2?1:8)%8&1:10);}
输出结果如下:
!! !! !!!! !! !! !! !! !! !! !! !!!! !! !! !! !! !! !! !! !!!! !! !! !!!! !! !! !! !! !! !! !! !!!! !! !! !! !! !! !! !! !!!! !! !!
如预期的一样,看来我们的想法并没有错。
原文出自:StackOverflow
B. 用c 语言编写程序时,应该特别注意格式,否则会影响可读性对吗
影响可读性肯定是有的,比如同样一段简单的代码
#include<stdio.h>
intmain(){
inti;
for(i=0;i<10;i++){
printf("%d ",i);
}
return0;
}
肯定会比
#include<stdio.h>
intmain(){inti;for(i=0;i<10;i++){printf("%d ",i);}return0;}
要易读得多。
不过要说特别注意,倒也不一定。C 语言不像 Python 一样,是一门特别讲究格式的语言,Python 是靠缩进来区分区块的,所以如果你每行的缩进有问题,解释器是会报错的,这就要求你必须严格遵循缩进规则。而 C 是靠分号来区分行,大括号来区分区块的,所以只要你的分号和大括号加对地方,编译器是不会在意代码格式的。因此每年都会有国际C语言混乱代码大赛(IOCCC),专门看谁能写出最混乱的代码,比如图示这段代码,但它能顺利通过编译。
所以影响可读性是肯定的,但要说特别注意格式,C 语言还不至于。不过平常最好还是严格遵循格式,不要图省事,养成良好的习惯。
C. 国际C语言混乱代码大赛的代码样例
第21届国际C语言混乱代码大赛(IOCCC)正式发布了获奖源代码。IOCCC要求参赛者写出最有创意且最让人难以理解的C语言代码,大小限制在4 kb以内,因此每位参赛者的作品都让人印象深刻。获胜者包括1名法国人,1名韩国人,5名美国人,1名比利时人,1名以色列人,1名英国人,4名日本人和1名中国人。
选取了几个代表性作品大家共赏一下更可怕的是,它们都可以编译通过!!!! #include <stdio.h>
#include <stdlib.h>
#define s(_)sizeof(_)
#define n void*
#define z(_)_,_,_
#define x (s*)__
#define y (s*)_
#define h C(y,y)
#define o &d
#define t() (p)
#define w(_)_,_
typedef n (*(*(*(*p)(n,n))(n,n))(n,n))(n,n);
typedef struct s { struct s* a ; struct s* UNUSED; } s;
typedef struct t { struct s* UNUSED; struct s* a ; } *t;
n __(n _,n __) { return _;}n _(n _,n __){return __; }
typedef unsigned char e;
#define _(_)((*_).a)
s*
w,
a={x ,x},
b={x ,y},
c={y,x},d={y,y};s l[]={&b,&d,w (w(w(w(w(w(&d)))))),w(&d),&c,&d,w(w(w(
&d))),&c,w(&b),&d,&a,z(&d),z(w (w(w(w(w(&d)))))),&b,&b,w(&d),&a,&b,w(&
d), z(w
(w( w(w
(&d))))),w(w(w(&d))), &b,&c,&d, &d,&a,&c ,w(w(&d)), &c,z(&b) ,w(&d),w(&a)
};s* C(s* a, s* b) {s* _=malloc(s(s));_(_)=a;_((t)_)=b;return _;}e k2=s(l
);p f(p
a,p b)
{ e k;s d;p v,r, q,i,C,c,u,g,m=t( )
_ ( _(_(w)));C=t() _(_(&l[fread(&k,s(e )
,s ( e),stdin)]));v =C(_,__);d=l[k=(e )
C ( k2,k)];c=(u=a( b,_),i=(t()_((t )
_ ( _(w))))(_,_(_(o)) ),(a(_(_((t)o)),(t( )
_ ( _((t)o)))(_,__) ))(b(_((t)_((t)o) )
, ( t()_((t)_((t)o))) (_,__)),_));{p a=t( )
_ ( (t)_(o));{p b= C(_,i(u(_,__),_) )
; { p u=C(_,(t()_(_(o) ))(_,__));_(_(_(w)) )
= ( s*)i(__,_(_( _(w))));r=b(m(c,_ )
,C ( m(_,(t()_(( t)_(_(w))))(_,__) )
, ( f)));v=b(_,v);i =b(a(_,__),_);g=(b )
( a(m(c(_,__),__ ),_),_);q=u(_((t )
_ ( o)),_)((t()_( (t)_(_(w))))((t( )
_ ( _((t)o)))(_(_((t )_(w))),(t()_(_((t )
_ ( w))))(_,__))( _,__),_)(_,__),_ )
;_ ( _((t)_(w))) = (s*)u(_((t)_(o)),_ )
( (t()_((t)_(_(w)))) (_,__),_)(_(_((t)o) )
,_ ( _((t)_(w))));} }_((t)_(_(w)))=(s* )
q ( a=(t()_((t)_(_(w))) )(_,__),_((t)_(_(w))) )
; fwrite((k=k,&k2) ,s(e),u(_,g)(s(e )
, ( e)s(s[s(s[s(s[s (s)])])])),stdout )
; fwrite((k2=k,&k) ,s(e),u(__,g)(s(e )
, ( e)s(s[s(s[s(s[s (s)])])])),stdout )
;_ ( _(_((t)w)))=(s*) u((t()_(_(_((t)w))) )
( _,__),_(_(_((t)w ))));_(_((t)_(w)) )
= ( s*)q(a(_(_((t) o)),_(_((t)_(w))) )
,_ ( _((t)_(w))));} _((t)_(_((t)w)))=(s* )
( t()_(_(_((t)w))) )(_((t)_(_((t)w)) )
,u ( (t()_((t)_(_(( t)w))))(_,__),_((t )
_ ( _((t)w)))));g =u((q=u(C(__,(t( )
_ ( _(_((t)w))))(_((t )_(_((t)w))),_)),_) )
( _,__),g);v=g( __,i(u(_,i(f,_) )
( _(_((t)o)),_( (t)_((t)o))),v) )
,r= q(_
,g( f,i
(v(f,(_(_(_(w)))=(s*)m,_)),r)));return q(_,v)(r(g(__,a),g(__,b)),r);}
int main
(){w=C(C(h,h),C(h,h));return printf((e*)f(_,_)(OK
,
^ Error
)) (运行生成更小的头像代码) /*++++[>i>n[t*/#include<stdio.h>/*2w0,1m2,]_<n+am+o>r>i>=>(['0n1'0)1;*/int/**/main(int/**/n,char**m){FILE*p,*q;intA,k,a,r,i/*#uinndcelfu_dset<rsitcdti_oa.nhs>i/_*/;char*d=P%d
%d40%d/**/
%d
0wb+,b[1024],y[]=yuriyurarararayuruyuri*daijiken**akkari~n**/y*u*k/riin<ty(uyr)g,aur,arr[a1r2a82*y2*/u*r{uyu}riOcyurhiyua**rrar+*arayra*=yuruyurwiyuriyurara'rariayuruyuriyuriyu>rarararayuruy9uriyu3riyurar_aBrMaPrOaWy^?*]/f]`;hvroai<dp/f*i*s/<ii(f)a{tpguat<cahfaurh(+uf)a;f}vivn+tf/g*`*w/jmaa+i`ni(/***/i+k[>+b+i>++b++>l[rb;int/**/u;for(i=0;i<101;i++)y[i*2]^=~hktrvg~dmG*eoa+%squ#l2:(wn1l))v?wM353{/Y;lgcGp`vedllwudvOK`cct~[|ju{stkjalor(stwvnegtyogYURUYURI[i]^y[i*2+1]^4;/*!*/p=(n>1&&(m[1][0]-'-'||m[1][1]!='