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?.
我正在备考 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?.