zpl代码可以编译的特殊字符_国际C语言混乱代码大赛(IOCCC)代码解析
生活随笔
收集整理的這篇文章主要介紹了
zpl代码可以编译的特殊字符_国际C语言混乱代码大赛(IOCCC)代码解析
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
2019年Best one-liner:http://ioccc.org/2019/burton/hint.html
這個程序只有一行:
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);}功能就是統計一個文件里的行數、單詞數、字母數。
加上換行格式化后是這樣的:
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這塊兒我也不熟,但看字面意思應該就是說把默認的變量設為int,然后加上stdio.h
然后就是代碼說明了:
先看循環條件:
n=-~getchar()//getchar函數不斷讀取字符,到結尾后返回EOF(-1),而-~(-1) =0;所以就可以跳出循環e += 11 == n, y++//e:行數統計 遇到換行符+1 y:字符統計 直接+1可以看到行數信息和字符數信息很容易就實現了。
然后就是for中的循環語句,嵌套了兩次三元運算符,主要功能就是統計單詞個數。
邏輯是這樣的:
如果當前字符為空格(或者換行,水平定位,垂直定位,換頁等)等分割字符,且前一個字符不是分割字符,那么單詞數加1.
o這個變量這里就是用來記錄前一個是否是特殊字符的。
具體解釋:
(n > 0xe) ^ (012 > n)://輸入字符為ascii中的9 到13時為假 其余為真 //即水平定位、換行、垂直定位、換頁、歸位;在ascii表中正好是連在一起的'`' ^ n ^ 65//輸入為空格時為假所以 n > 0xe ^ 012 > n && '`' ^ n ^ 65合起來就是分割字符時為假,其余為真
!n//恒等于0;用來迷惑人的
連起來就是說,
- 所以如果當前字符是正常字符,就把o標記為0;
- 如果當前字符是分割字符,
- 且當前的o=0(表示前一個字符不是分割字符),那么單詞數加一,o的值變為非0(這里是把j的值賦給了o)
- 否則o的值不變
最后一行就是打印了,循環退出的時候n=0;所以e^n就是e;
j += !o && y這個里面的y也是一定大于0的,只是用來混淆的。
總結
以上是生活随笔為你收集整理的zpl代码可以编译的特殊字符_国际C语言混乱代码大赛(IOCCC)代码解析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 老年人补牙多少钱一颗
- 下一篇: kafka 集群_10分钟搭建单机Kaf