不等于其值的整数



我有一段代码正在尝试调试,它产生了奇怪的结果。一个整数,它非常清楚地包含值 6,将 false 与文字 6 进行比较。
在我的代码中,这段代码:

int allGreen = 0;
int index = 0;
while (ch->fb[index]->selection_color() == FL_GREEN) 
{
    ++allGreen;
    ++index;
}
std::cout << allGreen << std::endl;
std::cout << std::boolalpha << (allGreen == 6) << std::endl;

生成输出:

6
false

我正在 Ubuntu 上使用 g++ 4.8.2 进行编译。

这怎么可能?

编辑:从条件中删除所有绿色无济于事。编辑 2:索引和所有绿色相等,正如预期的那样。两者都不等于 6,尽管两者都是 6。

ch->fb数组的大小是多少?如果它是 6 或更小,则可能是编译器优化此处的未定义行为。

当看到一些简单的循环时,例如

while ( a[i] ) i++;

编译器可以假设i永远不会超出数组a否则程序会调用未定义的行为。这就是0size of a - 1之间的i

后来,如果编译器看到类似i == 8,则8大于size of a - 1,则用false替换此条件。

可以肯定的是,您可以查看汇编代码。

文字 '6' 不是整数,值不为 6。

正如 deniss 已经指出的那样,越界访问数组是未定义的行为,所以也许这就是原因。确保也检查数组的边界。

因此,如果可以计算数组的每个selection_color,您可以尝试:

const int MAX_FB_VALUES = 6;
// ...
int countOfGreen = 0;
for (int i = 0; i < MAX_FB_VALUES; ++i)
{
    if(ch->fb[i]->selection_color() == FL_GREEN)
        ++countOfGreen;
}
std::cout << countOfGreen << std::endl;
std::cout << std::boolalpha << (countOfGreen == MAX_FB_VALUES) << std::endl;

当然,尽管无论如何使用容器会更好。

最新更新