[英]Why have i++; i--; right after each other?
我正在查看 1997 年發布的nmap的源代碼,我注意到這段代碼對我來說看起來有點奇怪:
int i=0, j=0,start,end;
char *expr = strdup(origexpr);
ports = safe_malloc(65536 * sizeof(short));
i++; /* <<<<<< */
i--; /* <<<<<< */
for(;j < exlen; j++)
if (expr[j] != ' ') expr[i++] = expr[j];
expr[i] = '\0';
你為什么要有i++;
然后我-- i--;
緊隨其后? i
是0
,然后i++
將i
變為1
。 之后, i--
將i
變為0
。
鏈接到原始源代碼。 搜索:
i++;
i--;
誰能解釋一下這是干什么用的?
這是一個錯誤。 這些行一起導致i
不變,所以它們不應該在那里。
介紹 nmap 的鏈接文章發表於 1997 年 9 月 1 日。如果您在https://svn.nmap.org/nmap 上查看 nmap 的 SVN 存儲庫,1998 年 2 月 10 日簽入的初始修訂版沒有這些行:
int i=0, j=0,start,end;
char *expr = strdup(origexpr);
char *mem = expr;
ports = safe_malloc(65536 * sizeof(short));
for(;j < exlen; j++)
if (expr[j] != ' ') expr[i++] = expr[j];
expr[i] = '\0';
所以這是作者在發布初始 nmap 源代碼和初始簽入到 SVN 之間發現並修復的問題。
這毫無用處。 它絕對沒有任何作用。
如果我推測它可能是開發過程中使用的一些調試代碼的殘余。
我猜i++
或i--
中的一個是在一個更改中引入的,另一個是在另一個中引入的。
但是,我無法找到介紹點,因為在最初的源代碼發布和第一個 SVN 修訂版之間沒有修訂歷史記錄。
對於非優化編譯器,或識別硬件副作用的編譯器,i++; i-- 序列會導致 i 從內存中讀取,然后重新寫入,無論通過 for 循環和嵌套 if 的路徑如何。
在並行處理中,有時會采用編譯器技巧來確保代碼序列使用其自己的變量本地副本而不是全局副本。
由於示例是代碼片段,因此無法確定使用的編譯器、預期的操作系統/硬件,也無法確定這是否在可以作為獨立線程執行的代碼序列/函數中。
在更簡單的系統中,我臨時強制更改變量以在調試環境中使用陷阱功能。 如果是這樣,作者可能在開發完成時忘記刪除代碼。
我建議您只檢查更新的代碼。 如果您在 (i-1) 之后使用 (i = 2+1) 則沒有意義。 i 的值保持不變。 您可以使用任何 c 或 c++ 編譯器嘗試它。 甚至在任何其他語言中都是相同的。 在編譯器中運行代碼。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.