一个混乱的 C 程序如下,它能正常运行么?如果能的话, 打印出什么?
main() { printf(&unix["\021%six\012\0"],(unix)["have"]+"fun"-0x60);}
解析:
在 unix 系统中,unix 是一个宏定义,其值为 1。就像是 #define unix 1
数组 array 的下标可以放在中括号里面,也可以与数组位置调转。
array[index] 和 index[array] 是等价的。
所以 &unix["\021%six\012\0"] 就是 &1["\021%six\012\0"] 就是 &"\021%six\012\0"[1] ,
\021 八进制表示的一个字符,下标 1, 跳过它就是从 %s 开始的字符串: "%six\012\0"
\012 就是 ASCII 码 10,就是 \n,所以程序就是
main() { printf("%six\n\0",(unix)["have"]+"fun"-0x60);}
后面的 (unix)["have"] 就是 1["have"],就是字符 ‘a‘。
所以 (unix)["have"]+"fun"-0x60 就是 ‘a‘ + "fun" - 0x60;
字符在做加法运算时取它的 ASCII 码,这里就是 0x61,
所以 0x61 +"fun" - 0x61,字符串参于运算时是地址参于运算,所以这里变成了 "fun" 从第 2 个字符开始的串,也就是 "un";
所以上面的程序就是
main() { printf("%six\n\0", "un";}
打印出来就是
unix
原文:http://my.oschina.net/xhan/blog/316923