天天看点

容易令人忽视的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 语句的难度了!写程序,严谨性是必不可少的!

继续阅读