给我的代码是否由于for循环而终止?

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

大家早上好,我正在为我的C考试而学习,有人问过这个问题:

“给出此代码,它终止吗?如果是,为什么?

 int main() {
 unsigned int i;
 for (i=1; i>0; i++);
 return 0;
 }

我一直认为它会因unsigned int的性质而终止:在for循环中,我自由地从1到最大值(我认为是2 ^ 32-1),然后循环遇到一个溢出异常,它返回0,即无符号int的第一个值。这与循环的条件i> 0冲突,并且终止了循环,将其“返回0”并终止了程序。

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

感谢任何愿意花一些时间阅读本文的人!

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

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


0
投票

[基本上,您说的话都是正确的。一旦循环计数器超过UINT_MAX(通常为2 ^ 32-1),它将换为0,这将导致由于不再满足循环条件而终止循环。

您所说的唯一错误是您使用了“例外”一词。 unsigned整数算术运算的结果大于UINT_MAX的结果没有问题。根据C11 Standard - 6.2.5 Types(p9),结果是明确的。它将仅受modulo UINT_MAX的影响,以便适合unsigned int

但是,请注意,使用signed整数,溢出会导致undefined behavior。有关更多信息,请参见以下StackOverflow问题:

Why is unsigned integer overflow defined behavior but signed integer overflow isn't?

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