for循环是否由于无符号int溢出而终止?

问题描述 投票:0回答:2

我正在为我的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”并终止了程序。

我的假设正确吗?教授没有给出解决方案,因此尽管这对我来说确实很有意义,但它可能是非常错误的,这就是为什么我需要您的帮助。

c for-loop integer-overflow unsigned-integer termination
2个回答
2
投票

[基本上,您说的话都是正确的。一旦循环计数器超过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?


0
投票

程序终止,因为计数器i到达UINT_MAX时将换为0。

© www.soinside.com 2019 - 2024. All rights reserved.