Ошибка Visual С++ 2008?

Самый простой код (в MS Visual С++ 2008 Express):

#include <iostream>
using namespace std;

int main()
{
    for (int a=1; 2*a<=7; a++)
        cout << a << endl;
    return 0;
}

Отладка дает мне правильный результат:

1
2
3

Но режим Release дает мне неправильный результат:

1
2

Ну, я понимаю возможные ответы "используйте 2 * a < 8"; "почему бы не a <= 3", "a < 4".

Я не хочу менять код, потому что это правильный код (хорошо работающий в режиме отладки, все переменные инициализируются хорошо и т.д.).

  • У вас такая же ошибка с Visual С++ 2008 Express?
  • Эта ошибка присутствует в младших версиях (2010, 2012)?
  • Как избежать этой ошибки?
  • Есть ли SP для его исправления?
  • Возможно ли изменить некоторые параметры компиляции (а не параметры по умолчанию)?

Update:

когда я пишу

cout << a+1 << endl;

или

cout << 2*a << endl;

он работает/компилирует правильные строки (3).


Примечание: Я пробовал на разных компьютерах с VС++ 2008 Express. Такое же поведение.

Ответ 1

Я могу воспроизвести это на VS2008 SP1. Как обычно, это ошибка оптимизатора кода. Вы должны посмотреть на разборку, чтобы увидеть причину. Он искажается при 2*a <= 7, когда он умножает умножение, он генерирует код для a <= 2. Конечно, это неправильно, должно быть a <= 3 или a < 4. Похоже, что он не обрабатывает корректный оператор <= для делений. Сложно, он должен знать разницу между четными и четными числами:)

Ошибка исчезает, когда вы не заставляете ее определять, как <= ведет себя с делением, используя 2*a < 8 отлично работает.

Эта ошибка была исправлена ​​некоторое время назад, я не знаю точно, когда, поскольку отчеты об ошибках для этих старых версий были удалены с общедоступного сайта. Лучший способ справиться с ошибками оптимизатора - дать им возможность исправить их, сохраняя ваш компилятор обновленным. У вас есть 3 новых версии Express Edition на выбор, что две собаки живут в разработке компилятора. Три с С++ 11 вокруг:)