Страницы

Поиск по вопросам

четверг, 26 декабря 2019 г.

Странная компиляция

#cpp #visual_cpp


Добрый день, есть у меня кусок кода, который я компилирую компилятором из VS 2008:
while(static int i = 0 < 5)
{
    i++;    
}

Я ожидал от него исполнения тела цикла 5 раз.
А вот что сделал компилятор:
    while(static int i = 0 < 5)
00401605  cmp         dword ptr [i (40701Ch)],0 
0040160C  je          wmain+2Fh (40161Fh) 
    {
        i++;    
0040160E  mov         ecx,dword ptr [i (40701Ch)] 
00401614  add         ecx,1 
00401617  mov         dword ptr [i (40701Ch)],ecx 
    }


Я ожидал от переменной i, что она, будучи статической, будет проинициализирована
на стадии компиляции значением 0. Она действительно была проинициализирована на стадии
компиляции, но значением 1 (!?).
Мне абсолютно не понятно, почему условие цикла while, i<5, скомпилировалось как cmp
dword ptr [i (40701Ch)],0
Исходя из листинга и пункта 1 очевидно, что программа уходит в бесконечный цикл.

Я не понимаю какого-то соответствующего момента в C++, или это баг компилятора?    


Ответы

Ответ 1



Дело в приоритете операций. Сравнение имеет бОльший приоритет, чем присвоение. Поэтому сначала происходит сравнение констант 0 и 5, которое компилятор производит на этапе компиляции, а далее его результат (т.е. 1) присваивается переменной i.

Комментариев нет:

Отправить комментарий