понедельник, 29 марта 2010 г.

Листая страницы твиттера

Забавная, хоть и слегка "водянистая" презентация о том как распознать цикл типа


for (int i = 0; i <>255;++i)
{
printf("%d",i);
}

кстати Hex-Rays будет декомпилировать пример из презентации как


int v0 = 0;
do
{
printf("%d",v0);
} while (v0<255);


и что интересно: почему компилятор интерпретирует оператор с предусловием как оператор с постусловием?
Я, например, честно и занудно скомпилировал это в 6-й, 2005 и 2008 студии. IDA показала следующую картинку:


что в переложении Hex-Rays будет

int v0 = 0;
while ( v0 < 255 )
{
printf("%d", v0++);
}

А это уже цикл с предусловием, как и было задумано. Почему не компилиретсяподобно примеру - не понял :-(. Но дядька не брешет - это факт. В дьябле, например, такая же фишка. Все for компилируются как do{} while().

3 комментария:

  1. оптимизатор рулит

    int v0 = 0;
    while ( v0 < 255 )
    {
    printf("%d", v0++);
    }
    уже на этапе компиляции известно что условие выполнится хотя бы один раз. Поэтому и постусловие

    ОтветитьУдалить
  2. а кстати да, надо поиграться с настройками оптимизации

    ОтветитьУдалить
  3. все поломано до нас
    http://wasm.ru/article.php?article=1009003

    ОтветитьУдалить