考虑简单的代码:
#include "stdio.h"
#define N 10U
int main() {
int a[N] = {0};
unsigned int i = N;
int s = 0;
// Fill a
while(i--)
s += a[i];
printf("Sum is %d\n", s);
return 0;
}
Does while
由于整数下溢,循环包含未定义的行为?编译器是否有权假设while
因此循环条件始终为真并以无限循环结束?
What if i
is signed int
?它不包含与数组访问相关的陷阱吗?
Update
我多次运行此代码和类似的代码,并且运行良好。此外,它是向后迭代数组和向量的流行方法。我问这个问题是为了确保从标准的角度来看这种方式是可以的。
乍一看,显然不是无限的。另一方面,有时编译器可以“优化”一些条件和代码,假设代码不包含未定义的行为。它可能会导致无限循环和其他不良后果。看this https://stackoverflow.com/questions/28631378/function-optimized-to-infinite-loop-at-gcc-o2.
此代码不会调用未定义的行为。循环将终止一次i
变成0
.
For unsigned int
,没有整数上溢/下溢。效果将与以下相同i
as signed
除非在这种情况下不会有包装。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)