首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C語言奇技淫巧:利用無符號整數下溢實現循環控制

     編輯:關於C語言

代碼示例

#include <stdio.h>
int main()
{
    int index = 1;
    while (--index < 1)
        printf("How are you!\n");
    return 0;
}

執行流程分析

  1. index 初始化為 1(有符號整數)。
  2. --index 先自減再取值:第一次循環判斷前 index 變為 0。
  3. 條件 0 < 1 為真,進入循環體打印。
  4. 第二次判斷:--index 使 index 從 0 變為 -1,條件 -1 < 1 仍為真。
  5. 此後 index 持續變為 -2、-3… 條件永遠為真,陷入無限循環。

若改為無符號整數

unsigned int index = 1;
while (--index < 1) // 第一次判斷 index=0,條件真;第二次 index=UINT_MAX,條件假
    printf("How are you!\n");

無符號整數下溢會環繞到最大值(UINT_MAX,通常為 4294967295),條件 UINT_MAX < 1 為假,循環僅執行一次。

核心知識點

  • 有符號整數溢出/下溢屬於未定義行為(UB):C 標準不保證環繞,編譯器可任意優化,實際運行極其危險。
  • 無符號整數溢出定義為模 2N 環繞:行為確定,可被利用(如循環計數器、哈希混合)。
  • 循環條件設計原則:優先使用明確的邊界變量(for (int i=0; i<n; ++i)),避免依賴溢出特性。

正確寫法對比

需求推薦寫法備註
執行 N 次for (int i=0; i<N; ++i)清晰、無 UB、編譯器易優化
倒序執行 N 次for (int i=N; i--; )利用 i-- 從 N-1 遞減至 0
無限循環while (1) 或 for (;;)語義明確

結語

這類「技巧」多源於對 C 整數提升、溢出規則的誤解或濫用。專業代碼應追求明確、可移植、無 UB,而非炫技。理解底層機制是為了避坑,而非製造難以維護的「聰明代碼」。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved