LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1075|回复: 1

谁能看明白这一行打印的内容?

[复制链接]
发表于 2008-1-18 16:21:41 | 显示全部楼层 |阅读模式
printf(&unix["\021%six\012\0"],(unix)["have"] + "fun" - 0x60);

出自C专家编程里的,输出为unix,高人解释一下
发表于 2008-1-20 03:55:07 | 显示全部楼层
Post by asert;1808574
printf(&unix["\021%six\012\0"],(unix)["have"] + "fun" - 0x60);

出自C专家编程里的,输出为unix,高人解释一下


在unix/linux平台上,unix被预定义为1.
其实这里只使用了一个技巧,就是a == i[a]
现在一句句地解释:
&unix["\021%six\012\0"]
=>
&"\021%six\012\0"[unix]
=>
char *p = "\021%six\012\0";
char p2 = &p[1];<=>char *p2 = p+1;
=>
"%six\012\0"
同理:
(unix)["have"] + "fun" - 0x60
=>
"have"[unix] => "have"[1] =>'a' =0x61
(unix)["have"]  - 0x60 => 1
"fun" + 1 => "un"
所以,上面改写之后,就是:
printf("%six\n\0", "un");

其实,照我看"\0"是不需要的。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表