簡體   English   中英

用遞歸反轉字符串的奇怪方法

[英]Strange way to reverse a string with recursion

我找到了這段代碼:

#include <stdio.h> 
#include <ctype.h> 

int f(int c) { 
    static int b;

    if (isspace(c))
        return b = c & '\n';

    f(getchar()); 

    return putchar(c) == b && f(c); 
} 

int main(void) { 
   return f(0); 
}

我想了解這段代碼是如何工作的,我從來沒有看到這種類型的代碼如此復雜, c & '\\n'為什么這個比較putchar(c) == b

有人幫我理解這個嗎?

c&'\\ n'僅在isspace為true時被調用,計算的值存儲在變量'b'中,該變量是靜態的,因此它在擴展和收縮時將通過遞歸堆棧向前和向后傳送。

我不得不查看isspace並找到: http ://www.tutorialspoint.com/c_standard_library/c_function_isspace.htm,它顯示了isspace匹配的6個字符。

&是一個按位AND,僅當兩個參數中的位都被使能時才會返回一個設置位的值(1)。

通過isspace中的值我們得到:

  • 0x20(空格)AND 0x0a(\\ n)給出0(\\ 0)字符串終止符
  • 0x09(tab)給出0x08(退格)
  • 0x0a(換行符)給出0x0a(換行符)
  • 0x0b(垂直制表符)再次給出0x0a
  • 0x0c(feed)再次給出0x08
  • 0x0d(回車)再次給出0x08

看看這個,我會說理想的結果可能是空格的終止符和換行符的換行符。 我猜想其他結果是不希望或預期的,當選項卡在輸入流中時,選項卡到退格轉換可能會導致函數產生非常奇怪的輸出。

總的來說,這是一種設計代碼的愚蠢方式,可能是混淆的C競賽的一個條目的一部分,在這些競賽中 ,這些事情受到了歡迎。 詳細介紹它可能會教你一些關於C語言的非常重要的事情,但這不是你應該在生產代碼中使用的東西。

這不是一個正確的程序; 如果輸入不包含PeteB發現b變為非零的字符( \\t \\n \\v \\f \\r ),則會有無限遞歸 - 嘗試… </dev/null

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM