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溢出而终止?的主要内容,如果未能解决你的问题,请参考以下文章

使用无符号索引执行反向“for”循环的最佳方法是啥?

JAVA的for语句结束循环条件中如何使用==符号?

无限循环计算阶乘问题

冒泡排序,选择排序,插入排序

Java for 循环没有在我的代码中终止

VC++ 6中“for循环”的终止条件是不是刷新?