2015-04-29 3 views
2

У меня есть часть кода, которую я пытаюсь отлаживать, что приводит к причудливым результатам. Целое число, которое очень четко содержит значение шесть, сравнивает ложное буквальный 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 

Я компиляция с г ++ 4.8.2 на Ubuntu.

Как это может случиться?

Редактировать: Удаление всего зеленого цвета из условия не помогает. Редактировать 2: индекс и allGreen равны, как и ожидалось. Ни один не равно 6, несмотря на оба они 6.

+0

Можем ли мы иметь «какое-то условие», поэтому мы можем запустить этот код самостоятельно – Borgleader

+0

Извините, некоторые условия не очень полезны, поскольку он плотно интегрирован с остальной базой кода. – Patrick

+0

Некоторое условие: «ch-> fb [allGreen] -> selection_color() == FL_GREEN« – Patrick

ответ

5

Каков размер ch->fb массива? Если это 6 или меньше, это может быть компилятор, оптимизирующий неопределенное поведение здесь.

Когда видим некоторый простой цикл, как

while (a[i]) i++; 

Компилятор может сделать предположение, что i никогда не выходит за пределы a массива, в противном случае программа вызывает неопределенное поведение. То есть i находится между 0 и size of a - 1.

Позже, если компилятор видит что-то вроде i == 8, там 8 больше size of a - 1, он заменяет это условие false.

Чтобы быть уверенным, вы можете посмотреть код сборки.

+0

Размер ch-> fb равен 6. – Patrick

+0

Затем я разберу свой ответ, чтобы показать, что происходит – deniss

+0

Похоже, вы правы в этой проблеме. Изменение размера до 7 устраняет проблему. Я заметил, что он работает над концом массива (я не писал код), но не думал, что это имеет значение, так как я получил номер 6 обратно. Мне было бы очень интересно узнать, почему это нарушает сравнение. – Patrick

1

Буквальный «6» не является целым числом и не имеет значение 6.

+1

Я не использовал одинарные кавычки в коде. Думаю, моя формулировка была довольно бедной. – Patrick

1

Как уже отмечалось, доступ к массиву за пределами границ является неопределенным поведением, поэтому, возможно, это и есть причина. Не забудьте также проверить границы массива.

Так что, если это нормально, чтобы считать каждый 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; 

Хотя было бы лучше использовать контейнер в любом случае, конечно.

+1

Спасибо. Я не понимал, что исчерпание границ может сломать будущее сравнение, поэтому я не беспокоился об этой части кода. Я бы, конечно, использовал контейнер, но этот код мне дал в этом состоянии. Было бы довольно интересно узнать, как это нарушает сравнение между 6 и 6. – Patrick

Смежные вопросы