C语言高手

: 这个程序是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! 不包括最后的会车, 
程序本身被执行了若干次.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值