发信人: abbelf (神之擎), 信区: C
标 题: Re: C语言高手
发信站: 饮水思源站 (Tue May 5 17:41:19 1998) , 站内信件
【 在 law (青铜时代) 的大作中提到: 】
: 这个程序是HP资深程序员写的。他写这个程序的目的是考验人们对C语言语法的熟悉
: 程度。我相信这个程序一定是符合ansi标准的,而且我相信他平时写程序的风格一定
: 也是很好的。
main(v,c)char**c;{for(v[c++]="hello,world!/n";
(!!c)[*c]&&(v--||--c&&execlp(*c,*c,c[!!c]+
!!c,!c));**c=!c)write(!!*c,*c,!!**c);}
整理一下
main( v, c )
char **c;
{
for ( v[c++] = "hello,world!/n";
(!!c)[*c] && ( v-- || --c && execlp( *c, *c, c[!!c] + !!c, !c ) );
**c = !c )
write( !!*c, *c, !!**c );
}
改写一下,
main( int v, char**c )
{
for ( c[v] = "hello,world!/n", c++;
c[0][1] && ( v-- || --c && execlp( *c, *c, c[1]+1, 0 ) );
**c = 0 )
write( 1, *c, c[0][0] ? 1 : 0 );
}
分析:(假设不带参数)
1. 刚开始: v = 1; c[0]是本身程序路径.(argv=1)
argv[1] = "hello,world!/n";
c[0][1] 为 argv[1][1] 是 'e';
v-- 为 1, "--c..."肯定不被执行
write( 1, "hello...", 1 ); 打印出'h'
argv[1][0] = '/0';
继续循环, 这时 v为0, 要执行 "--c &&..."
就是执行 execlp ( argv[0], argv[0], "ello,world!/n", 0 );
2.变成带一个参数执行, 这样 v = 2.
write会被执行两遍, 但是第二次没用.打印了0字节.
第一次打印乐argv[1][0].
然后再将执行 execlp( argv[0], argv[0], argv[1]+1, 0 );
这样递归下去, 打印出 e, l, l, o ....等等.
3. 当 argv[1] 只有一个字节的时候, 什么也不做.
总体效果: 打印出 hello,world! 不包括最后的会车,
程序本身被执行了若干次.
原作者: abbelf