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

C語言閏年判斷邏輯錯誤分析:為何輸入2012會輸出兩次結果?

     編輯:C 語言問答

閏年判斷程序的邏輯陷阱

初學者編寫閏年判斷程序時,常因 if-else 結構不當導致邏輯錯誤。以下代碼即為典型案例:

#include <stdio.h>

void main() {
    int n;
    do {
        scanf("%d", &n);
        if ((n % 4 == 0) && (n % 100 != 0))
            printf("是\n");
        if (n % 400 == 0)
            printf("是\n");
        else
            printf("不是\n");
    } while (1);
}

現象觀察

  • 輸入 2000 → 輸出「是」(正確)
  • 輸入 2012 → 輸出「是」和「不是」兩行(錯誤)

根因分析

代碼中存在兩個獨立的 if 語句,而非 if-else if-else 鏈:

  1. 第一個 if 判斷「能被 4 整除且不能被 100 整除」。
  2. 第二個 if 判斷「能被 400 整除」,其 else 僅屬於第二個 if。

以 2012 為例:

  • 滿足第一個條件 → 輸出「是」。
  • 不滿足第二個條件(2012 % 400 ≠ 0) → 進入第二個 else → 輸出「不是」。

以 2000 為例:

  • 不滿足第一個條件(2000 % 100 == 0) → 無輸出。
  • 滿足第二個條件 → 輸出「是」。

正確寫法

使用 else if 串聯,確保互斥:

if ((n % 4 == 0 && n % 100 != 0) || n % 400 == 0)
    printf("是\n");
else
    printf("不是\n");

或分層寫法:

if (n % 400 == 0)
    printf("是\n");
else if (n % 4 == 0 && n % 100 != 0)
    printf("是\n");
else
    printf("不是\n");

避坑指南

  • 多條件判斷時,優先考慮 if - else if - else 結構,避免獨立 if 導致多路執行。
  • 閏年規則記憶口訣:「四年一閏,百年不閏,四百年再閏」。
  • 編寫後務必測試邊界值:1900(非閏)、2000(閏)、2004(閏)、2012(閏)、2100(非閏)。

理解控制流結構是寫出正確邏輯的基礎,建議初學者多畫流程圖輔助思考。

錯誤運行截圖
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved