国际混乱C代码大赛代码解析:IOCCC 1984 —— anonymous

IOCCC 1984 —— anonymous

源程序如下:
 

程序输出:

hello, world!

 

下面来逐步解析下,这个看起来乱七八糟的helloworld程序是怎么回事?

 

Step 1:整理代码格式, 并补上被省略掉的函数返回值类型和return语句

说明1:没有指定函数返回值的情况下,编译器默认返回值为int类型;没有显式的return语句,函数结束编译器默认返回零。这些都是K&R时代的潜规则,不过现在的大部分编译器也都还能够兼容。

从整理后的代码可以清晰的看出,代码中定义了一个read函数,main函数调用了read函数,而read函数又调用了一个叫write的函数。

 

Step 2:化简并展开read调用

'-'-'-'实际就是两个减号字符相减,其值必为0;

'/'/'/'实际是两个斜杠字符相除,其值必为1。

即write(j/p+p, i---j, i/i);中的j为0,p为1,

j/p+p=0/1+1=1

i---j由于j为0,所有实际为i--

i/i=1

则read函数中对write的调用实际为write(1, i--, 1);

而变量i只使用一次,所以i--没有意义,write调用可进一步简化为write(1, i, 1);

 

再将main函数中read函数调用展开,代码如下:

 

Step 3:用指针替代字符串

 

Step 4:write函数

write函数不是标准C库函数,而已Posix标准定义的操作系统API

write函数原型:

int write(int fd, char * str, int len);

第一个参数fd为1,表示打印到标准输出(stdout);

i[p]根据C语言语法等价于*(p+i)

i+++h根据运算符优先级为(i++)+h

用标准C库函数fputc代替write函数,使用while循环代替for循环

    现在可以来解决helloworld是怎么打出来的了,程序同步循环p、h两个字符串,如果字符串p还没有到结束符,则打印字符串h对应位置的字符,由于p、h两个字符串长度相等,刚好可以完整打印整个字符串h,也就是“hello,world!“

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值