我有一段代码正在尝试调试,它产生了奇怪的结果。一个整数,它非常清楚地包含值 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
否则程序会调用未定义的行为。这就是0
和size 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;
当然,尽管无论如何使用容器会更好。