for 循环是否因为 unsigned int 溢出而终止?

Does the for loop terminate becaue of unsigned int overflow?

我正在备考 C 考试,有人问我这个问题:

"Given this code, does it terminate? If so, why?"

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

我一直认为它确实由于 unsigned int 的性质而终止:在 for 循环中 i 从 1 到最大值(我认为是 2^32 -1) 自由,然后循环遇到溢出异常并返回到 0,即 unsigned int 的第一个值。这与循环的条件 i>0 冲突并终止它,转到 "return 0" 并终止程序。

我的假设是否正确?我们没有教授给出的解决方案,所以虽然它对我来说确实有意义,但它可能非常不正确,这就是为什么我需要你的帮助。

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

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

您所说的唯一错误是您使用了 "exception" 这个词。 unsigned 整数算术运算的结果大于 UINT_MAX 并没有错。根据 C11 Standard - 6.2.5 Types(p9), the result is well-defined. It will just be subjected to modulo UINT_MAX + 1 使其适合 unsigned int.

但是,请注意 有符号 整数,溢出会导致 undefined behavior。有关详细信息,请参阅以下 Whosebug 问题:

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