Страницы

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

пятница, 30 ноября 2018 г.

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

Добрый день, есть у меня кусок кода, который я компилирую компилятором из 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++, или это баг компилятора?


Ответ

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

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

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