我見過的最短最強大的程序

#include<stdio.h>
main()
{
    
char *a="#include<stdio.h>%cmain()%c{%c%cchar *a=%c%s%c;%c%cprintf(a,10,10,10,9,34,a,34,10,9,10,10,10);%c%cgetch();%c}";
    printf(a,10,10,10,9,34,a,34,10,9,10,10,10);
    getch();
}

這段代碼的功能是輸出自己的源代碼 必須使用頭文件
當初是看到蘭大acm培訓教材裏有這個題目
百思不得其解
只好去找答案了

網上的解釋:
上面的紅色的部分是定義一個字符型的指針a,指向的是引號裏面的字符串部分;
上面的藍色的部分是輸出字符型指針a所指向的地址裏的內容,也就是引號裏的內容;
printf(a,10,10,10,9,34,a,34,10,9,10,10,10);
這裏小括號內的第一個a是作爲輸出字符串的參數傳入的,後面的
10,10,10,9,34,a,34,10,9,10,10,10都是作爲輸入格式控制的參數輸入的,也就是對應着#include<stdio.h>%cmain()%c{%c%cchar *a=%c%s%c;%c%cprintf(a,10,10,10,9,34,a,34,10,9,10,10,10);%c%cgetch();%c}裏面的那麼%c,%s,這些數字按字符輸出,它們對應的ASCII碼剛好是:
9   製表符 
10  換行符 
34  引號(")
32  空格


以下是我仿照改寫的c99標準版
從c99開始函數的返回值不再默認爲int
所以 main()是錯誤的寫法
而void main()  也是不合標準的寫法
可悲我們的教科書上還是一堆void main()
媽的 連個main函數都寫不對 還好意思來騙學生的錢


#include<stdio.h>
int main()
{
    char *a=
"#include<stdio.h>%cint%cmain()%c{%c%cchar*a=%c%s%c;%c%cprintf(a,10,32,10,10,9,34,a,34,10,9,10,10,10,32,10);%c%cgetch();%creturn%c0;%c}";
    printf(a,10,32,10,10,9,34,a,34,10,9,10,10,10,32,10);
    getchar();
    return 0;
}

 
發佈了29 篇原創文章 · 獲贊 2 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章