C++ while 循环优化无法正常工作

2024-05-08

我有这个代码段:

#include <stdio.h>

int main(int argc, const char** argv)
{
    int a = argv[0][0];
    int b = argv[0][1];

    while ((a >= 0) &&
           (a < b))
    {
        printf("a = %d\n", a);
        a++;
    }

    return 0;
}

我正在编译它gcc-4.5 -02 -Wstrict-overflow=5.

编译器对我大喊大叫warning: assuming signed overflow does not occur when changing X +- C1 cmp C2 to X cmp C1 +- C2

这究竟意味着什么?

如果我是正确的,这个循环永远不会导致溢出,因为要递增 a,它必须小于另一个整数。如果更大,则循环终止。

谁能向我解释这种行为?


编译器正在优化转换a + 1 < b to a < b - 1。 然而,如果b is INT_MIN那么这将下溢,这是行为的改变。 这就是它的警告。

当然,您可能会说这是不可能的,但是编译器解决问题的资源有限,并且通常不会对数据路径进行深入分析。

添加一个检查b >= 0可能会解决问题。

Edit: 还有一种可能是它在移动a >= 0到循环之外,因为(假设没有溢出)它永远不会改变。同样,该假设可能不适用于所有输入(即,如果b为负数)。您需要检查最终的装配,看看它实际上做了什么。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ while 循环优化无法正常工作 的相关文章

随机推荐