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!“