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]!='