Страницы

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

среда, 29 января 2020 г.

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

#cpp #логические_выражения


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

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

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


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


Ответы

Ответ 1



Все просто. Как thumb rule (ну, простое правило "на пальцах") - приведите разнородные типы в арифметических операциях к большему типу. Т.е. в true == 5 не 5 приводится к bool, а true превращается в int, равный 1. Сравнение дает результат bool, но его операнды - арифметические типы. Там, где оператор для логических операндов (&&, ||) - приводим операнды к типу bool. Вот и все.

Ответ 2



У вас интерференция между топиками "Типы данных и из преобразование" и "Логические операторы". В первом случае, ваше true приводится к типу int и происходит сравнение 1==5 с понятным итогом false. Во втором случае, 0==5 с аналогичным итогом В последнем случае, приведения типов первого операнда не будет, зато приведется тип второго операнда, 5 превратится в true Для того, чтобы не путаться, не пытайтесь сравнивать переменные разных типов. Всегда делайте явное приведение при помощи static_cast<>

Ответ 3



Это следствие правил конвертации в C/C++ Подробнее по пунктам: true == 5 Тут true сконвертился в int, и получилось сравнение 1 == 5 , что равно false false == 5 Тут false сконвертился в int, и получилось сравнение 0 == 5 , что равно false true && 5 Тут 5 сконвертился в true, и получилось true && true , что равно true

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

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