首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C 語言循環邏輯差異導致輸出不同:自然數立方和超百萬邊界分析

     編輯:程式設計綜合問答

五種寫法輸出對比

版本關鍵邏輯輸出 i實際立方和狀態
1. for 判斷在條件sum < 1e6 判斷 → 執行體 → i++46i=45 時 sum 已超,但 i++ 後才退出
2. break 立即跳出累加 → 判斷超過 → break45i=45 時 sum 首次超過,break 前 i 不再增
3. bool 標誌後判斷累加 → 更新標誌 → 循環條件檢查標誌 → i++46同版本1,標誌更新在體內,i++ 在條件後
4. 標誌前判斷更新標誌 → 累加 → 條件檢查 → i++47i=46 時標誌已真,仍執行體一次並 i++
5. break 後 i--break → i-- → 輸出45修正版本2,輸出真正超過的 i

for 循環執行順序鐵律

for (init; condition; increment) body;
// 等價於
init;
while (condition) {
    body;
    increment;
}

關鍵:increment 在 body 之後、下一次 condition 之前執行。無論 break、continue、return 如何跳轉,increment 只在正常完成 body 後執行。

邊界條件正確寫法

// 目標:找到最小的 n,使 1^3+...+n^3 > 1,000,000
int n = 0;
long sum = 0;
while (sum <= 1_000_000) {
    n++;
    sum += n * n * n;
}
System.out.println("n = " + n); // 45
System.out.println("sum = " + sum); // 1,071,225

或使用 for 但語義清晰:

int n;
long sum = 0;
for (n = 1; sum <= 1_000_000; n++) {
    sum += n * n * n;
}
// 循環結束時 n 已經是 46,需 n-1
System.out.println("n = " + (n - 1));

教訓總結

  • 邊界問題務必用 不變式思維:循環入口條件、循環體操作、循環出口條件三者對應。
  • 避免在循環條件中混雜副作用(如版本 3/4 的標誌更新),導致語義模糊。
  • 調試時在循環體首尾打印關鍵變量,觀察實際執行流。
  • 單元測試覆蓋邊界值(剛好等於、剛好超過)。

掌握 for 循環精確語義,是寫出正確邊界代碼的基礎功力。

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