Geo*_*tov 6 c c++ undefined-behavior
考虑简单的代码:
#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;
}
Run Code Online (Sandbox Code Playgroud)
while由于整数下溢,循环是否包含未定义的行为?编译器是否有权假设while循环条件始终为真,因此最终会出现无限循环?
如果i是的话signed int?它不包含与阵列访问相关的陷阱吗?
更新
我运行这个和类似的代码很多次,它工作正常.此外,它是向后迭代数组和向量的流行方式.我问这个问题,以确保从标准的角度来看这种方式是可行的.
乍一看,它显然不是无限的.另一方面,有时编译器可以"优化"某些条件和代码,假设代码不包含未定义的行为.它可能导致无限循环和其他不必要的后果.看到这个.
此代码不会调用未定义的行为.一旦i变为循环就会终止0.
对于unsigned int,没有整数上/下溢.效果会以相同i的signed,除了有会在这种情况下,没有包装.
因为整数下溢,while循环是否包含未定义的行为?
不,溢出/下溢仅在有符号整数的情况下是未定义的行为.
编译器是否有权假设while循环条件总是因为这个而最终是无限循环?
不,因为表达式最终会变为零.
如果我签署了int怎么办?它不包含与阵列访问相关的陷阱吗?
如果它已签名且上溢/下溢,则调用未定义的行为.
| 归档时间: |
|
| 查看次数: |
381 次 |
| 最近记录: |