Страницы

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

Показаны сообщения с ярлыком логические-выражения. Показать все сообщения
Показаны сообщения с ярлыком логические-выражения. Показать все сообщения

среда, 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

вторник, 28 января 2020 г.

Если НЕ одно из двух определённых значений, то умолчание. Как сделать это в PHP?

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


Мой скрипт на PHP принимает два языковых значения - &lang=ru или &lang=en. Если параметр
lang явно не указан или равен любому другому значению, то значение по умолчанию должно
быть установлено в en. Я несколько раз прочитал документацию по логическим операторам
в PHP, но так и не могу понять, как реализовать проверку


  если не ((lang = "en") или (lang = "ru")) тогда lang = "en" 


на PHP. На привычном мне Паскале я легко делаю вот так:

if not ((lang = 'en') or (lang = 'ru')) then lang := 'en';


Я потратил уйму времени, пытаясь реализовать эту нехитрую конструкцию на PHP, но
у меня ничего не получается. Силюсь понять что я делаю не так вот в этом коде:

if (!(($lang == "en") || ($lang == "ru"))) {
  $lang = "en";
};



Решение проблемы

После того, как Anton Shchyrov указал, что логическое выражение совершенно правильное,
я начал отлаживать скрипт и нашел ошибку.

Через полсотни строк я не заметил ошибку, характерную для тех, у кого нет опыта программирования
на языках, по синтаксису похожих на C/C++/PHP. Ниже проблемный кусок кода, который
останавливает шоу:

$Link = "https://www.domain.dummy/page.html;
if ($lang = "ru") {
  $Link = str_replace("dummy", "ru", $Link);
} else {
  $Link = str_replace("dummy", "co.uk", $Link);
}


Присвоение значения переменной в условии if () не может не впечатлять, но из-за этого
скрипт, разумеется, "снесло".

Не знаю как поступить в данном случае - следует ли попросить закрыть вопрос или оставить его?
    


Ответы

Ответ 1



Ну раз уж все в ответы пишут=) if (!in_array($lang, ['es', 'en', 'ru', 'fr'])) $lang = "en"; Любое количество предопределённых языков в одном условии. А ещё можно тернарно $lang = in_array($lang, ['es', 'en', 'ru', 'fr']) ? $lang : "en"; Список предопределяемых языков это массив который можно хранить в переменной $langs = ['es', 'en', 'ru', 'fr']; // Аналогично $langs = array('es', 'en', 'ru', 'fr');

Ответ 2



Мой скрипт на PHP принимает два языковых значения - &lang=ru или &lang=en. Если параметр lang явно не указан или равен любому другому значению, то значение по умолчанию должно быть установлено в en. Дефольтный язык en, если задан ru то язык будет ru. $lang = !isset($lang) || $lang !== 'ru'? 'en': 'ru'; echo $lang;

Ответ 3



:D Раз уж такая движуха... Сложно было придумать что-то новенькое, но я справился: switch ($lang) { case 'ru': case 'en': break; default: $lang = 'en'; break; }

Для чего нужны переменные флаги

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


Я только недавно натолкнулся на этот термин, и я не понимаю для чего они нужны и
когда использовать.

Пример

boolean haveFive = false; // флаг наличия 5ки в массиве

int[] a = new int[10]; // массив из 10 элементов

for (int i = 0; i < 10; i++) {
    a[i] = new Random().nextInt(10); // инициализация массива случайными значениями
от 0 до 9
    if (a[i] == 5) { // если в массиве есть 5 устанавливаем флаг в true
        haveFive = true;
    }
}

if (haveFive) {
    // выполняем некоторые действия
}

    


Ответы

Ответ 1



Переменная флаг – это, как правило, переменная логического типа, значение который характеризует состояние некоторого объекта. В примере haveFive переменная которая хранит состояние есть ли в массиве пятерка. Это переменная, которую вы можете использовать для управления потоком функции, позволяя вам проверять определенные условия во время выполнения вашей функции. if (haveFive) { // если в массиве есть пятерка // выполняем некоторые действия }

Ответ 2



Не очень понятен вопрос, тем не менее попробую ответить в меру своего понимания. Флаг это некая переменная, которая по сути является статусом некоторого объекта/сущности/множества. В классическом варианта флаг это булевская переменная, в более расширенном толковании флаг может иметь и несколько значений. В зависимости от значения флага используется ветвление логики программы if и/или switch Когда использовать? Флаги используются, когда статус сущности есть некая сложновычисляемая штука, поэтому чтобы зря не тратить каждый раз вычислительные ресурсы удобно запомнить статус сущности в виде флага и дальше использовать в логике программы. Например, в вашем случае то что массив содержит хотя бы одну пятерку - есть флаг.

Ответ 3



Не могу не запостить цитату из любимого мною "Чистого кода" Аргументы-флаги уродливы. Передача логического значения функции — воистину ужасная привычка. Она немедленно усложняет сигнатуру метода, громко провозглашая, что функция выполняет более одной операции. При истинном значении флага выполняется одна операция, а при ложном — другая! В листинге 3.7 у нас нет выбора, потому что вызывающая сторона уже передает этот флаг, а я хотел ограничить область переработки границами функции. Тем не менее вызов метода render(true) откровенно сбивает с толку бедного читателя. Если навести указатель мыши на вызов и увидеть render (boolean isSuite), ситуация слегка проясняется, но ненамного. Эту функцию следовало бы разбить на две: renderForSuiteO и renderForSingleTestO.

Ответ 4



Ну то что переменная-флаг нужна для хранения некоторого булевого результата (в данном случае будет ли в массиве хотя бы одна пятерка) вам уже написали, но надо заметить, что очень часто (и в данном случае) переменная-флаг не нужна, так как можно просто вынести функцию (и это будет работать быстрее): ... if(isHaveFive()) { // выполняем некоторые действия } } private static boolean isHaveFive() { int[] a = new int[10]; // массив из 10 элементов for (int i = 0; i < 10; i++) { a[i] = new Random().nextInt(10); // инициализация массива случайными значениями от 0 до 9 if (a[i] == 5) { // если в массиве есть 5 устанавливаем флаг в true return true; } } return false; }

четверг, 28 марта 2019 г.

Если НЕ одно из двух определённых значений, то умолчание. Как сделать это в PHP?

Мой скрипт на PHP принимает два языковых значения - &lang=ru или &lang=en. Если параметр lang явно не указан или равен любому другому значению, то значение по умолчанию должно быть установлено в en. Я несколько раз прочитал документацию по логическим операторам в PHP, но так и не могу понять, как реализовать проверку
если не ((lang = "en") или (lang = "ru")) тогда lang = "en"
на PHP. На привычном мне Паскале я легко делаю вот так:
if not ((lang = 'en') or (lang = 'ru')) then lang := 'en';
Я потратил уйму времени, пытаясь реализовать эту нехитрую конструкцию на PHP, но у меня ничего не получается. Силюсь понять что я делаю не так вот в этом коде:
if (!(($lang == "en") || ($lang == "ru"))) { $lang = "en"; };
Решение проблемы
После того, как Anton Shchyrov указал, что логическое выражение совершенно правильное, я начал отлаживать скрипт и нашел ошибку.
Через полсотни строк я не заметил ошибку, характерную для тех, у кого нет опыта программирования на языках, по синтаксису похожих на C/C++/PHP. Ниже проблемный кусок кода, который останавливает шоу:
$Link = "https://www.domain.dummy/page.html; if ($lang = "ru") { $Link = str_replace("dummy", "ru", $Link); } else { $Link = str_replace("dummy", "co.uk", $Link); }
Присвоение значения переменной в условии if () не может не впечатлять, но из-за этого скрипт, разумеется, "снесло".
Не знаю как поступить в данном случае - следует ли попросить закрыть вопрос или оставить его?


Ответ

Ну раз уж все в ответы пишут=)
if (!in_array($lang, ['es', 'en', 'ru', 'fr'])) $lang = "en";
Любое количество предопределённых языков в одном условии.
А ещё можно тернарно
$lang = in_array($lang, ['es', 'en', 'ru', 'fr']) ? $lang : "en";
Список предопределяемых языков это массив который можно хранить в переменной
$langs = ['es', 'en', 'ru', 'fr']; // Аналогично $langs = array('es', 'en', 'ru', 'fr');

суббота, 23 марта 2019 г.

Для чего нужны переменные флаги

Я только недавно натолкнулся на этот термин, и я не понимаю для чего они нужны и когда использовать.
Пример
boolean haveFive = false; // флаг наличия 5ки в массиве
int[] a = new int[10]; // массив из 10 элементов
for (int i = 0; i < 10; i++) { a[i] = new Random().nextInt(10); // инициализация массива случайными значениями от 0 до 9 if (a[i] == 5) { // если в массиве есть 5 устанавливаем флаг в true haveFive = true; } }
if (haveFive) { // выполняем некоторые действия }


Ответ

Переменная флаг – это, как правило, переменная логического типа, значение который характеризует состояние некоторого объекта. В примере haveFive переменная которая хранит состояние есть ли в массиве пятерка.
Это переменная, которую вы можете использовать для управления потоком функции, позволяя вам проверять определенные условия во время выполнения вашей функции.
if (haveFive) { // если в массиве есть пятерка // выполняем некоторые действия }