for循环是否由于无符号int溢出而终止?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了for循环是否由于无符号int溢出而终止?相关的知识,希望对你有一定的参考价值。
我正在为我的C考试而学习,有人问过这个问题:
“给出此代码,它终止吗?如果是,为什么?”
int main()
unsigned int i;
for (i=1; i>0; i++);
return 0;
我一直认为它确实会由于unsigned int
的性质而终止:在for循环中,i
从1到最大值(我认为是2 ^ 32-1)自由变化,然后循环遇到溢出异常,它返回0,即无符号int的第一个值。这与循环的条件i> 0冲突,并且终止了循环,将其“返回0”并终止了程序。
我的假设正确吗?教授没有给出解决方案,因此尽管这对我来说确实很有意义,但它可能是非常错误的,这就是为什么我需要您的帮助。
[基本上,您说的话都是正确的。一旦循环计数器超过UINT_MAX(通常为2 ^ 32-1),它将换为0,这将导致由于不再满足循环条件而终止循环。
您所说的唯一错误是您使用了“例外”一词。 unsigned整数算术运算的结果大于UINT_MAX的结果没有问题。根据C11 Standard - 6.2.5 Types(p9),结果是明确的。它将只接受modulo UINT_MAX +1,以便适合unsigned int
。
但是,请注意,使用signed整数,溢出会导致undefined behavior。有关更多信息,请参见以下StackOverflow问题:
Why is unsigned integer overflow defined behavior but signed integer overflow isn't?。
程序终止,因为计数器i
到达UINT_MAX时将换为0。
以上是关于for循环是否由于无符号int溢出而终止?的主要内容,如果未能解决你的问题,请参考以下文章