閱讀763 返回首頁    go 阿裏雲 go 技術社區[雲棲]


[原創]另類調用 printf 完成任務的方法

昨天逛csdn/c版,看到如下一道題:

函數原形已經給出:int p(int i, int N);

功能:調用該函數,打印如下格式的輸出,例p(1, 7);
1
2
3
4
5
6
7
6
5
4
3
2
1

即每行一個數字。(注意:N隻打印一次)

要求:

1. 函數中唯一能夠調用的函數就是printf。
2. 不準使用如下的關鍵字:typedef, enum, do, while, for, switch, case, break, continue, goto, if。
3. 不能使用逗號表達式和?:表達式。
4. 函數中隻能有一條語句。

很快有人給出了答案,果不出所料,用的是遞歸。但貌似不符合題目要求1。難道...
斷了遞歸這條路之後,貌似隻有用偶得老本行啦:


int p(int i,int N)
{
    __asm__ __volatile__("movl %%esp,%%ebx;0:cmp $0,%0;jz 1f;pushl %%esi;"
                        "pushl %%edi;call _printf;incl %%esi;decl %0;jmp 0b;"
                        "1:cmp $0,%1;jz 2f;pushl %2;pushl %%edi;call _printf;"
                        "decl %1;decl %2;jmp 1b;2:movl %%ebx,%%esp"
                        ::"m"(N-i+1),"m"(N-i),"m"(N-1),"S"(i),"D"("%d/n"));
}

(編譯環境 gcc v3.3.1)

over!

最後更新:2017-04-02 00:06:29

  上一篇:go 如何編寫lighttpd插件
  下一篇:go 悼念