C语言变态的HelloWorld
C语言真是世界上最难的语言,所以C++是最恐怖的语言
第一种实现方式,使用宏定义
1 2 3 4 5 6 7 8 9 10 11 12
| // file main.c #define _________ } #define ________ putchar #define _______ main #define _(a) ________(a); #define ______ _______(){ #define __ ______ _(0x48)_(0x65)_(0x6C)_(0x6C) #define ___ _(0x6F)_(0x2C)_(0x20)_(0x77)_(0x6F) #define ____ _(0x72)_(0x6C)_(0x64)_(0x21) #define _____ __ ___ ____ _________ #include <stdio.h> _____
|
看一下该代码经过预处理之后是什么样子,使用$ gcc -E main.c -o main.i
1 2
| // file main.i 看最后的部分,main函数 main(){ putchar(0x48);putchar(0x65);putchar(0x6C);putchar(0x6C); putchar(0x6F);putchar(0x2C);putchar(0x20);putchar(0x77);putchar(0x6F); putchar(0x72);putchar(0x6C);putchar(0x64);putchar(0x21); }
|
现在我们来解析这段代码,一步一步看
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| #include <stdio.h> //这句之前的都是宏定义,之后的代码在预编译阶段会进行宏替换 _____ >>>> __ ___ ____ _________ -- 先看来第一个 __ >>>> ______ _(0x48)_(0x65)_(0x6C)_(0x6C) >>>> _______(){ _(0x48)_(0x65)_(0x6C)_(0x6C) >>>> main(){ putchar(0x48);putchar(0x65);putchar(0x6C);putchar(0x6C); -- 继续 ___ >>>> _(0x6F)_(0x2C)_(0x20)_(0x77)_(0x6F) >>>> putchar(0x6F);putchar(0x2C);putchar(0x20);putchar(0x77);putchar(0x6F); -- 继续 ____ >>>> _(0x72)_(0x6C)_(0x64)_(0x21) >>>> putchar(0x72);putchar(0x6C);putchar(0x64);putchar(0x21); -- 最后 _________ >>>> } 由四部分组成,所以得到了上面的那段代码 0x全是16进制数,以ASCII码形式转换成字符,前面是零,不是'鸥' 0x48 > 72 == H 0x65 > 101 == e 0x6c > 108 == l 0x6f > 111 == o 0x2c > 44 == , 0x20 > 32 == Space(空格) 0x77 > 119 == w 0x72 > 114 == r 0x64 > 100 == d 0x21 > 33 == !
|
输出结果Hello, world!
,你的呢?测试了吗?
此乃没有写返回值类型的main函数噢
好了,就分析这一个,剩下的贴代码,太丧心病狂了