在四级考试的前一天,咸鱼的我不仅没有学英语,还开始研究起了IOCCC(国际混乱C语言代码大赛)。个人C语言学的也比较渣,在看了这些大神的代码之后,更加感觉自己C语言都学狗身上去了,先看第一个代码:

int i;main(){for(;i["]<i;++i){--i;}"];read('-'-'-',i+++"hell\
o, world!\n",'/'/'/'));}read(j,i,p){write(j/p+p,i---j,i/i);}

初看太乱,先用devc格式化一下,再加上头文件返回值

#include <stdio.h>
int i;
int main()
{for(; i["]<i;++i){--i;}"]; read('-'-'-',i+++"hell\
o, world!\n",'/'/'/'));return 0;
}
void read(j,i,p)
{write(j/p+p,i---j,i/i);
}

显然for循环那一排最后那个反斜杠只是用来换行写而已。再把字符串用字符数组替换,对程序的运行应该是没有影响的

#include <stdio.h>
int i;
int main()
{char a[]="]<i;++i){--i;}";char b[]="hello, world!\n";for(; i[a]; read('-'-'-',i+++b,'/'/'/'));return 0;
}
void read(j,i,p)
{write(j/p+p,i---j,i/i);
}

好像差不多能看懂了?不过i[a]是什么东西?这就要提到C语言的一个特性了,a[b] 与 b[a]等价,所以 i[a] 可以替换成 a[i],看来这里只是一个普通的取数组内容而已啊。我们再分析一下read函数的三个参数,可以看到 '-'-'-' 的值恒等于0,'/'/'/'值等于1,既然如此,我们再把代码更新一下

#include <stdio.h>
int i;
int main()
{char a[]="]<i;++i){--i;}";char b[]="hello, world!\n";for(; a[i]; read(0,i+++b,1));return 0;
}
void read(j,i,p)
{write(1, i--, 1);
}

很明显,write函数参数里的 i-- 并没有什么用。现在唯一不太正常的地方就是那个 i+++b 了。先看优先级,++ 高于 +,所以等价于 i++ + b,而b是数组名,我们学过b 和 &b[0] 是一样的,那么 i++ + b 不就相当于 b+i; i++ 了嘛。b+i 就是 &b[i]。

for循环至此已经大致清晰了,我们把for换成while,让代码更清晰一点吧。

#include <stdio.h>
int i;
int main()
{char a[]="]<i;++i){--i;}";char b[]="hello, world!\n";while(a[i]){read(0, &b[i], 1);i++;}
}
void read(int j, int i, int p)
{write(1, i, 1);
}

看得出来,main函数是遍历一遍a数组,然后传了b数组每一个元素的地址给write函数。我们看一下a和b数组,我们可以看出来a和b两个数组的长度是相同的。Amazing! 这下遍历a数组不就相当于遍历b数组嘛,看来a数组完全没用。

最后一个问题就是write函数了,这个函数是干什么的呢?我们来百度一下。

write()

用于将数据写入到文件描述符对应的文件,原型:

ssize_t write(int fd,const void*buf,size_t count);

参数说明:

fd:是文件描述符(输出到command line,就是1)

buf:通常是一个字符串,需要写入的字符串

count:是每次写入的字节数

返回值:

成功:返回写入的字节数

失败:返回-1并设置errno

ps: 写常规文件时,write的返回值通常等于请求写的字节

数count, 而向终端设备或者网络写时则不一定

现在清晰了,本程序中的write函数就是每次在屏幕中输出一个字符,而这个字符还是我们给的b数组中的内容,套个循环,这不就相当于输出b数组了嘛。最后,我再给一个最易读的代码吧

#include <stdio.h>
int main()
{printf("hello, world!\n");return 0;
}

ioccc代码分析(1)相关推荐

  1. 20145236《网络攻防》Exp4 恶意代码分析

    20145236<网络攻防>Exp4 恶意代码分析 一.基础问题回答 如果在工作中怀疑一台主机上有恶意代码,但只是猜想,所有想监控下系统一天天的到底在干些什么.请设计下你想监控的操作有哪些 ...

  2. C#中类的继承 override virtual new的作用以及代码分析

    继承中override virtual new的作用 virtual 父类中需要注明允许重写的方法: override 子类中必须显示声明该方法是重写的父类中的方法: new 子类中忽略父类的已存在的 ...

  3. 2017.4.18 静态代码分析工具sonarqube+sonar-runner的安装配置及使用

    配置成功后的代码分析页面: 可以看到对复杂度.语法使用.重复度等等都做了分析,具体到了每一个方法和每一句代码. 四种使用方式: sonarqube + sonar-runner sonarqube + ...

  4. lighttpd1.4.18代码分析

    lighttpd1.4.18代码分析(八)--状态机(2)CON_STATE_READ状态 posted @ 2008-09-24 10:50 那谁 阅读(2225) | 评论 (1)  编辑 lig ...

  5. Device Tree(三):代码分析

    2019独角兽企业重金招聘Python工程师标准>>> 一.前言 Device Tree总共有三篇,分别是: 1.为何要引入Device Tree,这个机制是用来解决什么问题的?(请 ...

  6. 使用Hadoop和ELK进行业务代码分析!分分钟捉到Bug!

    大数据是计算领域的新高地,它有望提供一种方法来应对二十一世纪不断增长的数据生成.越来越多的大数据爱好者正在涌现,越来越多的公司正在采用各种大数据平台,并希望提出以客户为中心的解决方案,帮助他们在竞争激 ...

  7. 20145328 《网络对抗技术》恶意代码分析

    20145328 <网络对抗技术>恶意代码分析 ------看到这句话说明还没写完-------- 实践内容: 使用schtasks指令监控系统运行 使用sysmon工具监控系统运行 使用 ...

  8. starGAN原理代码分析

    下载: git clone https://github.com/yunjey/StarGAN.git 1 cd StarGAN/ 1 下载celebA训练数据: bash download.sh 1 ...

  9. tensorflow笔记:多层CNN代码分析

    tensorflow笔记系列:  (一) tensorflow笔记:流程,概念和简单代码注释  (二) tensorflow笔记:多层CNN代码分析  (三) tensorflow笔记:多层LSTM代 ...

  10. ARM裸机篇---启动代码分析

    ARM裸机篇---启动代码分析 先搞清楚启动代码和Bootloader的区别,启动代码是指CPU复位后到进入C语言的main函数之前需要执行的那段汇编代码. 下面的代码先暂且这样吧,没啥注释的,时间关 ...

最新文章

  1. l2_norm c++代码实现
  2. UVa11855 Buzzwords(hash)
  3. 鸿蒙基于JS搭建HelloWorld并修改国际化文件
  4. 关于移动端meta设置(未完待续)
  5. 让你的PHP也能执行JS并获得JS函数的返回值
  6. PPT将立方体形状变为很薄的长方体
  7. 随机过程及其在金融领域中的应用 第三章 习题 及 答案
  8. GridView 中 Bind和Eval的区别详解
  9. 印象笔记等App被点名:违法收集公民个人信息
  10. reviewboard安装实战
  11. How to increase sales, in addition to manufacturing different phones
  12. Java通过Netty实现Websocket消息推送
  13. 计算机网络课程设计 学校园网设计
  14. 《明朝那些事儿》读书笔记
  15. java webservice接口开发实例_Webservice 接口开发简单例子
  16. php7 电子书 下载,php7.3.8中文电子手册
  17. Skipping JaCoCo execution due to missing execution data file
  18. 阿里云网站域名备案注销方法
  19. 台式计算机win如何联网,台式win7怎么连wifi
  20. 了解CI/CD流水线

热门文章

  1. Learun,一款专注于业务,不用写代码的框架
  2. fio: engine libaio not loadable
  3. Kubernetes tutorial - K8S 官方入门教程 中文翻译
  4. 3.3、怎么通过STLINK下载程序(附STLINK驱动包)
  5. 【temu】美国版数据采集API
  6. 西门子estop指令_西门子6RA80直流调速器调试步骤和参数设置
  7. 用App designer制作数字华容道
  8. 自适应波束形成matlab,自适应波束形成matlab
  9. matlab实时处理数据,Matlab下实现的实时数据采集和处理
  10. opencv之调取摄像头拍照