Как компилятор с++ выполняет неявные действия с кодом?

Есть код по типу:

if (1)
   cout << 1;

Т.к. 1 - int, то оно неявно конвертируется в bool. Но у меня вопрос, как происходит эта неявная конвертация? Например во время компиляции компилятор сам допишет туда (bool)1 или как-то иначе?


Ответы (1 шт):

Автор решения: Кирилл Малышев

Такой код, конечно, будет оптимизирован. Но можно попробовать скомпилировать без оптимизации и посмотреть результат в ассемблере.

Рассмотрим код:

int a = 1;
if (a)
    std::cout << 1;

GCC с опцией -O0 генерирует такой ассемблер:

mov     DWORD PTR [rbp-4], 1
cmp     DWORD PTR [rbp-4], 0
je      .L2
mov     esi, 1
mov     edi, OFFSET FLAT:_ZSt4cout
call    std::basic_ostream<char, std::char_traits<char> >::operator<<(int)
.L2:

За сравнение отвечают первые 3 строки. Сначала идёт команда mov, которая записывает в память число для сравнения. Далее, выполняется команда cmp. Она вычитает из нашей единицы число 0. Это не бессмысленное действие, потому что при этом выставляются специальные флаги, по которым можно узнать, как относятся друг с другом сравниваемые числа (больше, меньше или равны). Команда je перенаправляет выполнение кода на участок, который следует после тела оператора if, если сравниваемые числа были равны. Мы знаем, что 1 > 0, поэтому этого не произойдёт, но эта оптимизация не была произведена.

Тут надо понимать, что машинные команды ничего не знают о типе bool. И вообще о типах. Все сравнения происходят в ассемблере подобным образом в целых числах. Есть ещё похожая по назначению команда test.

→ Ссылка