zoukankan      html  css  js  c++  java
  • 循环的注意点

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

    循环条件有什么问题呢? 循环是有可能一次也没有执行,比如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这个值是用户输入的,那么就提示用户重新输入合法的数据。

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

  • 相关阅读:
    长春理工大学第十四届程序设计竞赛F Successione di Fixoracci——找规律&&水题
    长春理工大学第十四届程序设计竞赛A Rubbish——并查集&&联通块
    长春理工大学第十四届程序设计竞赛D Capture The Flag——哈希&&打表
    2018ccpc吉林 E:THE TOWER——数形结合
    区间第K小——可持久化线段树模板
    牛客练习赛3 贝伦卡斯泰露——队列&&爆搜
    [LeetCode] Find Peak Element
    [LeetCode] Intersection of Two Linked Lists
    C++静态库与动态库
    模板的全特化与偏特化
  • 原文地址:https://www.cnblogs.com/yfish/p/9785714.html
Copyright © 2011-2022 走看看