Логические операторы c++

111
28 июня 2019, 04:50

Начал учить с++, на теме логических операторов после пары минут экспериментов наткнулся на то, что есть некоторые нелогичные моменты у логических операторов. А именно - как-будто в с++ есть три возможных boolean значения.

Интересные моменты моих экспериментов:

true == 5 дает false (хотя всё true, что не 0)
false == 5 дает false (тут было бы все нормально, если бы не предыдущее выражение)
true && 5 дает true (тут мой мозг взорвался, потому что оператор && возвращает true, если оба операнда - true, 
а два операнда не могут быть true, если один операнд != другой операнд (5 != true даст true), а всего существует только 2 варианта значения (true, false).

Как можно формализовать такие знания в какую-то систему, которую проще запомнить (ведь она должна быть, иначе смысла в логических выражений не будет, если они будут нелогичны)?

Answer 1

Все просто. Как thumb rule (ну, простое правило "на пальцах") - приведите разнородные типы в арифметических операциях к большему типу. Т.е. в

true == 5

не 5 приводится к bool, а true превращается в int, равный 1. Сравнение дает результат bool, но его операнды - арифметические типы.

Там, где оператор для логических операндов (&&, ||) - приводим операнды к типу bool.

Вот и все.

Answer 2

У вас интерференция между топиками "Типы данных и из преобразование" и "Логические операторы".

В первом случае, ваше true приводится к типу int и происходит сравнение 1==5 с понятным итогом false.

Во втором случае, 0==5 с аналогичным итогом

В последнем случае, приведения типов первого операнда не будет, зато приведется тип второго операнда, 5 превратится в true

Для того, чтобы не путаться, не пытайтесь сравнивать переменные разных типов. Всегда делайте явное приведение при помощи static_cast<>

Answer 3

Это следствие правил конвертации в C/C++

Подробнее по пунктам:

true == 5

Тут true сконвертился в int, и получилось сравнение 1 == 5 , что равно false

false == 5

Тут false сконвертился в int, и получилось сравнение 0 == 5 , что равно false

true && 5

Тут 5 сконвертился в true, и получилось true && true , что равно true

READ ALSO
Как преобразовать string в char?

Как преобразовать string в char?

Есть произвольная строка не больше 25 символовНапример "wo1fram" Как преобразовать ее в массив char[255]? Чтобы потом с char можно было работать как...

119
Отфильтровать по дате (стрим)

Отфильтровать по дате (стрим)

Есть список обьектов, у каждого из них есть поле ZonedDateTime createdDate необходимо сделать выборку обьектов за последний год

157
Как загрузить файл в облачное хранилище (Google Drive, Яндекс Диск)?

Как загрузить файл в облачное хранилище (Google Drive, Яндекс Диск)?

В процессе создания телеграмм бота,мне понадобилось загружать файлы, которые отправляют пользователи, в облачное хранилищеВозможно я плохо...

115
Отправить фото на стену группы VK

Отправить фото на стену группы VK

Не могу загрузить фото на стену в группе , загрузил фото в профиль photo3420_326050355 и получил url при передаче VKApiwall()

117