基本思想是:

  1. 在程序中生成字符串self;

  2. 加入把self改写成程序自身的算法编码;

  3. 输出self字符串。

1
2
3
#include <stdio.h>
char* recurse="#include <stdio.h>%cchar* recurse=%c%s%c;%cint main(){printf(recurse,10,34,recurse,34,10,10);}%c";
int main(){printf(recurse,10,34,recurse,34,10,10);}

解析:

引号里面的内容全都是string串:”#include %cchar recurse=%c%s%c;%cint main(){printf(recurse,10,34,recurse,34,10,10);}*%c“;

执行过程如下:

printf方法首先打印第一个参数recurse,一直打印到第一个%c 其中第一个%c表示的是打印main函数中的printf方法的第二个参数10,表示的是换行符

然后接着正常打印到第二个%c,表示printf第三个参数34,表示的是引号 然后是%s,表示的是将recurse完全转化为一个string串然后打印出来(意思就是其中的%c%s等等都变成了string串,而不会执行之前转义符的功能)

然后是第三个%c,同样是34,引号

第四个%c,10,换行符

第五个%c,10,换行符