C语言变态的HelloWorld

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函数噢
好了,就分析这一个,剩下的贴代码,太丧心病狂了

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×