Ответ 1
Я могу воспроизвести это на VS2008 SP1. Как обычно, это ошибка оптимизатора кода. Вы должны посмотреть на разборку, чтобы увидеть причину. Он искажается при 2*a <= 7
, когда он умножает умножение, он генерирует код для a <= 2
. Конечно, это неправильно, должно быть a <= 3
или a < 4
. Похоже, что он не обрабатывает корректный оператор <= для делений. Сложно, он должен знать разницу между четными и четными числами:)
Ошибка исчезает, когда вы не заставляете ее определять, как <= ведет себя с делением, используя 2*a < 8
отлично работает.
Эта ошибка была исправлена некоторое время назад, я не знаю точно, когда, поскольку отчеты об ошибках для этих старых версий были удалены с общедоступного сайта. Лучший способ справиться с ошибками оптимизатора - дать им возможность исправить их, сохраняя ваш компилятор обновленным. У вас есть 3 новых версии Express Edition на выбор, что две собаки живут в разработке компилятора. Три с С++ 11 вокруг:)