整数不等于它的值

Integer not comparing equal to its value

我有一段代码正在尝试调试,它产生了奇怪的结果。一个整数,非常清楚地包含值 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:正如预期的那样,index 和 allGreen 是相等的。两者都不等于 6,尽管都是 6。

文字“6”不是整数,其值不是 6。

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

当看到像

这样的简单循环时
while ( a[i] ) i++;

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

稍后,如果编译器发现类似 i == 8 的内容,其中 8 大于 size of a - 1,它会将此条件替换为 false

为了保险起见,您可以查看汇编代码。

正如 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;

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