while(i - )s + = a [i]; 在C和C++中包含未定义的行为?

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?它不包含与阵列访问相关的陷阱吗?

更新

我运行这个和类似的代码很多次,它工作正常.此外,它是向后迭代数组和向量的流行方式.我问这个问题,以确保从标准的角度来看这种方式是可行的.

乍一看,它显然不是无限的.另一方面,有时编译器可以"优化"某些条件和代码,假设代码不包含未定义的行为.它可能导致无限循环和其他不必要的后果.看到这个.

hac*_*cks 9

此代码不会调用未定义的行为.一旦i变为循环就会终止0.

对于unsigned int,没有整数上/下溢.效果会以相同isigned,除了有会在这种情况下,没有包装.

  • 这是标记的C++,对所有答案都有1/5的downvote比率.(有一个+1来抵消.) (2认同)

Lun*_*din 6

因为整数下溢,while循环是否包含未定义的行为?

不,溢出/下溢仅在有符号整数的情况下是未定义的行为.

编译器是否有权假设while循环条件总是因为这个而最终是无限循环?

不,因为表达式最终会变为零.

如果我签署了int怎么办?它不包含与阵列访问相关的陷阱吗?

如果它已签名且上溢/下溢,则调用未定义的行为.