循环的注意点

我觉得但凡是循环都要注意两个点,第一个是循环继续的条件,第二个是溢出的问题。

循环条件有什么问题呢? 循环是有可能一次也没有执行,比如n>input的时候,可以对input和n做一个判断,如果n<=input的时候才进行循环,这样可以避免问题。

for (n = 1; n <= input; n++)
{

}

第二是类似自增 自减这种操作是可能产生溢出的。

让一个正数一直加1,最后这个正数可能变成负数了

测试一下下面的代码

int main()
{

	int n = 100000;


	while (1)
	{
		n+=5000;

		if (n < 0)
		{
			printf("%d", n);
			break;
		}
	
	}
	return 1;
}

  

让一个负数一直减1这个负数可能就变成正数了。

测试一下下面的代码

int main()
{

	int n = -100000;


	while (1)
	{
		n-=5000;

		if (n > 0)
		{
			printf("%d", n);
			break;
		}
	
	}
	return 1;
}

一个正数一直乘以一个正数最后结果可能是负数了(乘法就是用加法实现的)。

测试一下下面的代码

int main()
{

	int n = 100000;


	while (1)
	{
		n*=5000;

		if (n <0)
		{
			printf("%d", n);
			break;
		}
	
	}
	return 1;
}

一个正数对一个正数做整除可能最后结果变成一个负数了(除法可以用乘法实现,而乘法是加法实现的)

int main()
{

	int n = 100000;


	while (1)
	{
		n/=0.001;

		if (n <0)
		{
			printf("%d", n);
			break;
		}
	
	}
	return 1;
}

溢出和循环又有什么关系呢?

还是看下面这个代码

for (n = 1; n <= input; n++)
{

}

假设input的值正好是int能表示的最大的整数,当n的值也是这个最大的正数的时候,循环是可以继续的,执行完循环体内部代码之后,n++,这个时候n就溢出了,n变成负数了,此时再看循环条件,一个负数是永远小于正数的,那么,n从负数一直加,直到变成一个正数,正数小于n 则继续循环,加加加 直到n又产生了溢出,如此往复,这样我们的程序就完全不是想要的结果了。

怎么解决这个问题呢? 我觉得可以在循环内部检测一下n的值,如果n小于0则说明溢出了,直接退出循环,如果input这个值是用户输入的,那么就提示用户重新输入合法的数据。

在实际学习中 可能不常遇到溢出的情况,但是在实际生产过程中可能一不小心就写出了溢出的代码,因为程序的逻辑都是没有问题的,所以很难检查出来。

原文地址:https://www.cnblogs.com/yfish/p/9785714.html