Начал учить с++, на теме логических операторов после пары минут экспериментов наткнулся на то, что есть некоторые нелогичные моменты у логических операторов. А именно - как-будто в с++ есть три возможных boolean значения.
Интересные моменты моих экспериментов:
true == 5 дает false (хотя всё true, что не 0)
false == 5 дает false (тут было бы все нормально, если бы не предыдущее выражение)
true && 5 дает true (тут мой мозг взорвался, потому что оператор && возвращает true, если оба операнда - true,
а два операнда не могут быть true, если один операнд != другой операнд (5 != true даст true), а всего существует только 2 варианта значения (true, false).
Как можно формализовать такие знания в какую-то систему, которую проще запомнить (ведь она должна быть, иначе смысла в логических выражений не будет, если они будут нелогичны)?
Все просто. Как thumb rule (ну, простое правило "на пальцах") - приведите разнородные типы в арифметических операциях к большему типу. Т.е. в
true == 5
не 5 приводится к bool
, а true
превращается в int
, равный 1. Сравнение дает результат bool
, но его операнды - арифметические типы.
Там, где оператор для логических операндов (&&
, ||
) - приводим операнды к типу bool
.
Вот и все.
У вас интерференция между топиками "Типы данных и из преобразование" и "Логические операторы".
В первом случае, ваше true
приводится к типу int
и происходит сравнение 1==5
с понятным итогом false
.
Во втором случае, 0==5
с аналогичным итогом
В последнем случае, приведения типов первого операнда не будет, зато приведется тип второго операнда, 5 превратится в true
Для того, чтобы не путаться, не пытайтесь сравнивать переменные разных типов. Всегда делайте явное приведение при помощи static_cast<>
Подробнее по пунктам:
true == 5
Тут true
сконвертился в int
, и получилось сравнение 1 == 5
, что равно false
false == 5
Тут false
сконвертился в int
, и получилось сравнение 0 == 5
, что равно false
true && 5
Тут 5
сконвертился в true
, и получилось true && true
, что равно true
Виртуальный выделенный сервер (VDS) становится отличным выбором
Есть произвольная строка не больше 25 символовНапример "wo1fram" Как преобразовать ее в массив char[255]? Чтобы потом с char можно было работать как...
Есть список обьектов, у каждого из них есть поле ZonedDateTime createdDate необходимо сделать выборку обьектов за последний год
В процессе создания телеграмм бота,мне понадобилось загружать файлы, которые отправляют пользователи, в облачное хранилищеВозможно я плохо...
Не могу загрузить фото на стену в группе , загрузил фото в профиль photo3420_326050355 и получил url при передаче VKApiwall()