0

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

if (1)
   cout << 1;

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

n 1 k z z z
  • 1,491
  • 6
  • 23
  • 0 считается false не ноль true. И всё. В данном случае скобки автоматически преобразуют выражение к bool. В данном случа 1 это литерал и он будет оптимизирован (в вечный true, т.е. if уйдёт, ветки не будет, но думаю первым предложением я верно ответил. – nick_n_a Apr 24 '21 at 22:51

1 Answers1

3

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

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

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.

  • Спасибо вам за ответ, но хотелось бы еще прояснить. Если мы находимся в теле описания класса и допустим в каком либо методе мы присваиваем какое-либо значение, некоторому полю этого класса - int MyClass::abc(){ a = 1; }, насколько я знаю это будет эквивалентно следующему - int MyClass::abc(){ this->a = 1; }. Так вот, у меня вопрос этот самый this-> компилятор как будто припишет к коду, или он прост сгенерирует ассемблерный код, как будто там, что то было? – n 1 k z z z Apr 25 '21 at 06:44
  • 1
    Ассемблер ничего не знает про C++. Ни про this, ни про объекты. И даже про переменные. На этапе генерации машинного кода уже нет синтаксиса C++. С точки зрения стандарта C++ приведëнные примеры эквивалентны по поведению. Компилятор сгенерирует такой машинный код, который будет соответствовать стандарту. Т.е. будет выполнять то, что вы написали в программе. – Кирилл Малышев Apr 25 '21 at 07:05
  • 1
    Он не припишет, а просто выяснит, какое a есть в области видимости, и если оно единственное и подходит по типу - просто скомпилирует этот код... – Harry Apr 25 '21 at 08:20