当前位置: 技术问答>linux和unix
main() { printf(&unix["\021%six\012\0"], (unix)["have"] + "fun" - 0x60); }
来源: 互联网 发布时间:2015-02-17
本文导语: 这是我在网上发现的一个程序, 据说是美国最“怪”C程序大赛的获奖程序 . 大家试一试看看是什么结果?能看出什么门道吗? | 1、这关键是看读者是对UNIX下编译器的熟悉程度 即使讲明了 MACR...
这是我在网上发现的一个程序, 据说是美国最“怪”C程序大赛的获奖程序 .
大家试一试看看是什么结果?能看出什么门道吗?
大家试一试看看是什么结果?能看出什么门道吗?
|
1、这关键是看读者是对UNIX下编译器的熟悉程度 即使讲明了
MACRO unix = 1,恐怕都没有几个人可以找到在哪里定义的。
2、另一个就是对数组的理解.1["abcd"] "abcd"[1]
也就是'b'
&1["abcd"]就是'b'的地址
"abcd"与char str[] = "abcd"效果是一样的,编译的时候都会当作局部数据。
MACRO unix = 1,恐怕都没有几个人可以找到在哪里定义的。
2、另一个就是对数组的理解.1["abcd"] "abcd"[1]
也就是'b'
&1["abcd"]就是'b'的地址
"abcd"与char str[] = "abcd"效果是一样的,编译的时候都会当作局部数据。
|
环境:
SunOS 5.8 Generic_108528-01 sun4u sparc SUNW,Ultra-5_10
gcc version 2.95.2 19991024 (release)
结果:
unix
首先,unix预编译后会被替换成1(gcc -E);
其次,1["string"]等同于"string"[1], 有意思
SunOS 5.8 Generic_108528-01 sun4u sparc SUNW,Ultra-5_10
gcc version 2.95.2 19991024 (release)
结果:
unix
首先,unix预编译后会被替换成1(gcc -E);
其次,1["string"]等同于"string"[1], 有意思
|
结果就是"unix"!
关键就在unix == 1上,如果知道了这个就不难理解了。
关键就在unix == 1上,如果知道了这个就不难理解了。