容易令人忽視的if、else語句邏輯錯誤
阿新 • • 發佈:2019-01-06
昨天看習題,回憶起來之前初學C語言時被絆倒過的一個問題,今天就把它拿出來再理一遍,以警醒自己。順便給不知道閏年的普及下(估計也沒人不知道
吧):
當時自以為思路比較清晰地直接把這段程式寫出來了,殊不知執行時候才發現結果漏掉了幾個閏年,程式跑出來240,實際數值卻為243。為什麼呢?#include <stdio.h> #include <stdlib.h> int main(void) { /*判斷1000年到2000之間的閏年並輸出*/ int year = 1000; int count = 0; for (year; year <= 2000; year++) //for迴圈從1000年到2000年 { if (year % 4 == 0) //若該year能被4整除 { if (year % 100 != 0)//若該year不能被100整除 { count++; printf("%d ",year); } } else if (year%400 == 0) //若該year能被400整除 { count++; printf("%d ", year); } } printf("\n%d\n", count); system("pause"); return 0; }
原因在當程式滿足條件 (year%4 == 0)進入第一個 if 語句,又因不滿足 (year%100 != 0)而退出,直接跳到下一次迴圈。講到這裡,就不難發現了,原來能
被 4 整除不能被 100 整除的年也有可能是閏年,比如 400 ,然而卻因為 if 、 else的邏輯沒有搞清楚而漏掉了這幾條魚。所以將該程式中的 else if 中的 else 刪
掉,便能很好的解決這個問題。
還有另一種方法,更為簡便,那就是用邏輯運算子:
int main(void) { /*判斷1000年到2000之間的閏年並輸出*/ int year = 1000; int count = 0; for (year; year <= 2000; year++) //for迴圈從1000年到2000年 { if ((year%4 == 0 && year%100 != 0) || year%400 == 0) { count++; printf("%d ", year); } } printf("\n%d\n", count); system("pause"); return 0; }
直接用一條語句判斷,這樣的邏輯是不是更簡單清晰呢?由這個問題看來不能小覷 if 語句的難度了!寫程式,嚴謹性是必不可少的!