大家早上好,我正在为我的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”并终止了程序。
我的假设正确吗?教授没有给出解决方案,因此尽管这对我来说确实很有意义,但它可能是非常错误的,这就是为什么我需要您的帮助。
感谢任何愿意花一些时间阅读本文的人!
程序终止,因为计数器i
到达UINT_MAX时将换为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?。