天天看點

容易令人忽視的if、else語句邏輯錯誤

昨天看習題,回憶起來之前初學C語言時被絆倒過的一個問題,今天就把它拿出來再理一遍,以警醒自己。順便給不知道閏年的普及下(
容易令人忽視的if、else語句邏輯錯誤

估計也沒人不知道

吧):

容易令人忽視的if、else語句邏輯錯誤
#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;
}
           

當時自以為思路比較清晰地直接把這段程式寫出來了,殊不知運作時候才發現結果漏掉了幾個閏年,程式跑出來240,實際數值卻為243。為什麼呢?

原因在當程式滿足條件 (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 語句的難度了!寫程式,嚴謹性是必不可少的!

繼續閱讀