[英]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中的值我們得到:
看看這個,我會說理想的結果可能是空格的終止符和換行符的換行符。 我猜想其他結果是不希望或預期的,當選項卡在輸入流中時,選項卡到退格轉換可能會導致函數產生非常奇怪的輸出。
總的來說,這是一種設計代碼的愚蠢方式,可能是混淆的C競賽的一個條目的一部分,在這些競賽中 ,這些事情受到了歡迎。 詳細介紹它可能會教你一些關於C語言的非常重要的事情,但這不是你應該在生產代碼中使用的東西。
這不是一個正確的程序; 如果輸入不包含PeteB發現b
變為非零的字符( \\t
\\n
\\v
\\f
\\r
),則會有無限遞歸 - 嘗試… </dev/null
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.