zpl代码可以编译的特殊字符_国际C语言混乱代码大赛(IOCCC)代码解析
2019年Best one-liner:http://ioccc.org/2019/burton/hint.html
這個(gè)程序只有一行:
e,n,j,o,y;main(){for(++o;n=-~getchar();e+=11==n,y++)o=n>0xe^012>n&&'`'^n^65?!n:!o?++j:o;printf("%8d%8d%8dn",e^n,j+=!o&&y,y);}功能就是統(tǒng)計(jì)一個(gè)文件里的行數(shù)、單詞數(shù)、字母數(shù)。
加上換行格式化后是這樣的:
e, n, j, o, y; main() {for (++o; n = -~getchar(); e += 11 == n, y++)o = n > 0xe ^ 012 > n && '`' ^ n ^ 65 ? !n : !o ? ++j : o;printf("%8d%8d%8dn", e ^ n, j += !o && y, y); }編譯指令:
WARN="-Wno-implicit-int -Wno-missing-variable-declarations -Wno-parentheses" clang -Wall -Wextra -Weverything -pedantic $WARN -include stdio.h -o prog prog.c這塊兒我也不熟,但看字面意思應(yīng)該就是說(shuō)把默認(rèn)的變量設(shè)為int,然后加上stdio.h
然后就是代碼說(shuō)明了:
先看循環(huán)條件:
n=-~getchar()//getchar函數(shù)不斷讀取字符,到結(jié)尾后返回EOF(-1),而-~(-1) =0;所以就可以跳出循環(huán)e += 11 == n, y++//e:行數(shù)統(tǒng)計(jì) 遇到換行符+1 y:字符統(tǒng)計(jì) 直接+1可以看到行數(shù)信息和字符數(shù)信息很容易就實(shí)現(xiàn)了。
然后就是for中的循環(huán)語(yǔ)句,嵌套了兩次三元運(yùn)算符,主要功能就是統(tǒng)計(jì)單詞個(gè)數(shù)。
邏輯是這樣的:
如果當(dāng)前字符為空格(或者換行,水平定位,垂直定位,換頁(yè)等)等分割字符,且前一個(gè)字符不是分割字符,那么單詞數(shù)加1.
o這個(gè)變量這里就是用來(lái)記錄前一個(gè)是否是特殊字符的。
具體解釋:
(n > 0xe) ^ (012 > n)://輸入字符為ascii中的9 到13時(shí)為假 其余為真 //即水平定位、換行、垂直定位、換頁(yè)、歸位;在ascii表中正好是連在一起的'`' ^ n ^ 65//輸入為空格時(shí)為假所以 n > 0xe ^ 012 > n && '`' ^ n ^ 65合起來(lái)就是分割字符時(shí)為假,其余為真
!n//恒等于0;用來(lái)迷惑人的
連起來(lái)就是說(shuō),
- 所以如果當(dāng)前字符是正常字符,就把o標(biāo)記為0;
- 如果當(dāng)前字符是分割字符,
- 且當(dāng)前的o=0(表示前一個(gè)字符不是分割字符),那么單詞數(shù)加一,o的值變?yōu)榉?(這里是把j的值賦給了o)
- 否則o的值不變
最后一行就是打印了,循環(huán)退出的時(shí)候n=0;所以e^n就是e;
j += !o && y這個(gè)里面的y也是一定大于0的,只是用來(lái)混淆的。
總結(jié)
以上是生活随笔為你收集整理的zpl代码可以编译的特殊字符_国际C语言混乱代码大赛(IOCCC)代码解析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 老年人补牙多少钱一颗
- 下一篇: 治疗输卵管堵塞大约多少钱