标签:自增 inpu ret 假设 逻辑 最大 过程 数据 循环
我觉得单反是循环都要注意两个点,第一个是循环继续的条件,第二个是溢出的问题。
循环条件有什么问题呢? 循环是有可能一次也没有执行,比如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这个值是用户输入的,那么就提示用户重新输入合法的数据。
在实际学习中 可能不常遇到溢出的情况,但是在实际生产过程中可能一不小心就写出了溢出的代码,因为程序的逻辑都是没有问题的,所以很难检查出来。
标签:自增 inpu ret 假设 逻辑 最大 过程 数据 循环
原文地址:https://www.cnblogs.com/yfish/p/9785714.html