Найти в Дзене
VktrSansara

Arduino, Логические операторы - && (AND), || (OR) и ! (NOT)

В этой статье я рассмотрю не только стандартные логические операторы языка C++ но так же их приоритеты выполнения и несколько других примеров. Стандартные логические операторы - && (AND), || (OR) и ! (NOT) возвращают всего два значения True ( 1 ) или False ( 0 ), они используются в условиях конструкциях, циклах и т.п. ( AND ) && - логическое «И» ( OR ) || - логическое «ИЛИ» ( NOT ) ! - логическое «НЕ» Синтаксис выражения: a && b a || b !a Пример: (Логические операторы могут использоваться с типом Boolean в любой комбинации) bool a = true, b = false; Serial.print( a && b ); // - вернет true только в том случае, если оба значения равны true Serial.print( a || b ); // - вернет true если одно или два значения равны true, иначе false Serial.print( !b ); // - инвертирует (меняет) значение, если true вернет false, если false вернет true Наглядно все результаты таких операций можно увидеть в таблице: Логические операторы в условных конструкциях. bool var = true; if (var) Serial.print("Tru

В этой статье я рассмотрю не только стандартные логические операторы языка C++ но так же их приоритеты выполнения и несколько других примеров.

Стандартные логические операторы - && (AND), || (OR) и ! (NOT) возвращают всего два значения True ( 1 ) или False ( 0 ), они используются в условиях конструкциях, циклах и т.п.

( AND ) && - логическое «И»

( OR ) || - логическое «ИЛИ»

( NOT ) ! - логическое «НЕ»

Синтаксис выражения:

a && b

a || b

!a

Пример:

(Логические операторы могут использоваться с типом Boolean в любой комбинации)

bool a = true, b = false;

Serial.print( a && b ); // - вернет true только в том случае, если оба значения равны true

Serial.print( a || b ); // - вернет true если одно или два значения равны true, иначе false

Serial.print( !b ); // - инвертирует (меняет) значение, если true вернет false, если false вернет true

Наглядно все результаты таких операций можно увидеть в таблице:

-2

Логические операторы в условных конструкциях.

bool var = true;

if (var) Serial.print("True!"); // True!

Думаю, тут стоит пояснить на пальцах такой простой пример.

Оператор if служит для того, чтобы выполнить какую-либо операцию в том случае, когда условие является верным. Так как var равно true в монитор выводится "True!".

Рассмотрим условия:

// AND - «И»

bool a = true, b;

if (a && b) {

Serial.print("True!"); // Не выполнится

} else {

Serial.print("False!"); // Выведет "False!"

}

// ( OR ) || - «ИЛИ»

bool a = true, b;

if (a || b) {

Serial.print("True!"); // Выведет "True!"

} else {

Serial.print("False!"); // Не выполнится

}

// ( NOT ) ! - «НЕ»

bool var = true;

if (!var) { // Тут мы инвертируем значение логическим "НЕ"

Serial.print("True!"); // Не выполнится

} else {

Serial.print("False!"); // Выведет "False!"

}

XOR (исключающее «ИЛИ») В язык C++ не содержится встроенной логической оператор XOR, но имея известные нам три оператора && (AND), || (OR) и ! (NOT), мы можем реализовать XOR.

Выглядеть это будет так:

bool a, b;

bool c = (a || b) && !(a && b);

Serial.print(с); // false

Таблица истинности XOR:

-3

Приоритеты логических операторов.

Давайте сразу разберемся с двумя терминами - "Приоритет операций" и "Ассоциативность".

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

Ассоциативность — направление выполнения операций в случае, если операции имеют одинаковый приоритет.

На самом деле все операторы имеют свой приоритет, но я буду писать только о рассматриваемых в этой статье. Таблицу приоритетов операций можно посмотреть по этой ссылки.

Согласно таблице логические операторы в C++ имеют следующие приоритеты:

( NOT ) ! - Приоритет 3й группы, ассоциативность - справа налево.

( AND ) && - Приоритет 13й группы, ассоциативность - слева направо.

( OR ) || - Приоритет 14й группы, ассоциативность - слева направо.

Чем меньше номер группы, тем выше приоритет.

Наглядно посмотрим на работу приоритетов, на примере исключающего «ИЛИ» XOR. Запишем тот же самый код но только лешим его круглых скобок которые указывают на порядок действий и посмотрим что у нас получится.

bool a, b;

bool c = a || b && !a && b;

Взглянем на те данные что нам будет выдавать это выражение:

false | false | false

true | false | false

false | true | true

true | true | true

На первый взгляд какой то бред, а вот с точки зрения приоритетов выполнения операций все логично. На этом примере показано что приоритет оператора определяет порядок операций в выражениях.

Круглые скобки ( ) - тоже являются операторами и имеют приоритет 2й группы, ассоциативность - слева направо.

Можете самостоятельно попробовать расставить приоритеты в двух выражениях:

(a || b) && !(a && b) и a || b && !a && b

(О приоритетах других операторов я еще буду писать в других статьях.)