Найти тему
VktrSansara

Arduino, Операторы сравнения и Условные выражения

Операторы сравнения применяются в условных выражениях, конструкциях if, if...else, циклах for или while. Результат таких операций вернет true, если условие верное, иначе false.

В C++ имеется 6 операторов сравнения. Синтаксис выражения, приоритеты и ассоциативность:

Приоритет 9й группы, ассоциативность - слева направо.

a == b (a равно b)

a != b (a не равно b)

Приоритет 8й группы, ассоциативность - слева направо.

a < b (a меньше чем b)

a > b (a больше чем b)

a <= b (a меньше чем или равно b)

a >= b (a больше чем или равно b)

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

(Про приоритеты и ассоциативность я уже упоминал в статье про Стандартные логические операторы, так же про приоритеты можно прочитать по ссылке.)

Условные выражения - это условие которое возвращают значение типа bool, то есть значение true или false. К условным выражениям относятся операции отношения и логические операции.

Примеры c операциями отношения:

int a = 2, b = 3;

Равенство ( == )

bool c = a == b;

Serial.print( c ); // false, "a" и "b" не равны.

Неравенство ( != )

bool c = a != b; // true, "a" и "b" не равны.

Меньше ( < )

bool c = a < b; // true

Больше ( > )

bool c = a > b; // false

Меньше или равно ( <= )

bool c = a <= b; // true, "a" меньше, но не равно "b"

Больше или равно ( >= )

bool c = a >= b; // false, "a" не больше и не равно "b".

Операторы - < > <= =>

При помощи операторов сравнений можно задавать сложные условия.

Я приведу самый банальный пример который приводят в этом случае, например нам нужно узнать лежит ли условная переменная "a" в диапазоне значений от 10 до 20:

a = 15;

if ( a > 10 && a < 20 ) {

// True! Выполнится этот блок кода, так как - a = 15

} else {

// False! Выполнится только в том случаи если а не попадет в диапазон от 10 до 20

}

Тут есть один нюанс, а именно в сравнениях что мы используем в выражении. Дело в том что если "a" будет равно 10 то выполнится блок else, тоже самое будет если "a" равно 20. Говоря совсем простым языком при условии если a = 10 или 20, то что бы выполнился блок if (true) переменная "a" должна иметь любое значение от 11 до 19.

В каких то случаях это может быть не критично, а в каких то даже решением какого то вопроса, где то стать огромной проблемой. Для указания более точного диапазона нужно использовать другие операторы сравнения:

a = 15;

if ( a >= 10 && a <= 20 ) {

// True! Выполнится этот блок кода, так как - a = 15

} else {

// False! Выполнится только в том случаи если а не попадет в диапазон от 10 до 20

}

Теперь блок if (true) будет выполнятся всегда пока переменная "a" будет лежать четко в диапазоне от 10 до 20, а блок else будет выполнятся если "a" будет меньше 10 и больше 20.

Думаю этот пример более чем понятно объясняет разницу между сравнениями.

Равенство ( == ) и Неравенство ( != )

Я специально сначала описал примеры работы < >, >= и <= так как их приоритет выше чем у == и !=.

Равенство ( == ) возвращается true, если оба операнда имеют одинаковое значение, иначе false.

Давайте рассмотрим немножко сложный пример с равенством:

int a = 2, b = 4, x = 8, y = 7;

if ( a < b == x > y ) {

// True! Выполнится этот блок кода

} else {

// False! Не выполнится

}

Я специально написал такой пример что бы лишний раз напомнить о приоритетах и ассоциативности.

На выражения в круглых скобках можно взглянуть так - true == true

Неравенство ( != ) возвращается true, если оба операнда имеют разные значения, иначе false.

Пример:

int a = 2, b = 4;

if ( a != b ) {

// True! Выполнится этот блок кода

} else {

// False! Не выполнится

}

Так же стоит сказать что сравнивать можно не только логические и числовые значения, но так же символы и строки. И к ним применимы все перечисленные выше операторы.

Начнем с сравнения символов:

char a = 'a';

char b = 'b';

void setup() {

Serial.begin(9600);

if ( a == b ) {

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

} else {

Serial.println("False!"); // Выполнится этот блок кода

}

}

void loop() {}

Тоже условие применимо к строчным и заглавным буквам.

Давайте сравним две буквы - заглавную "А" и строчную "а".

- Как думаете какая буква "старшая", а какая "младшая"?

Для ответа на этот вопрос напишем следующий код:

char a_1 = 'A';

char a_2 = 'a';

void setup() {

Serial.begin(9600);

if ( a_1 > a_2 ) { // "А" старче, чем "а" ???

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

} else {

Serial.println("False!"); // Выполнится этот блок кода

}

}

void loop() {}

- Выходит что "а" старше, чем "А", тут дело не в размере буквы, я специально задал этот вопрос что бы ввести читателя в небольшое заблуждение.

Тут нужно будет немножко коснутся типа данных char (О нем у меня есть отдельная статья). На самом деле это целочисленный тип данных, а переменная хранит номер или удобнее сказать "код" символа.

В нашем случаи код символа "А" это 65, а символа "а" - 97 в десятичной системе счисления. Так и получается что 65 < 97. (Для примера можно посмотреть на эту таблицу ASCII)

Пойдем дальше и сравним строки:

char s_1[ ] = "Viktor";

char s_2[ ] = "viktor";

void setup() {

Serial.begin(9600);

if ( s_1 == s_2 ) {

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

} else {

Serial.println("False!"); // Выполнится этот блок кода

}

}

void loop() {}

И тут стоит уточнить - что сравнение строк на равенство работает не так как сравнение символов, строки сравниваются посимвольно на равенство, слева направо, если было совпадение то сравнивается следующая пара символов. Это продолжается до тех пор, пока символы не будут отличаться или пока не будет достигнут завершающий нулевой символ (null или же \0).

Если в примере выше мы заменим равенство ( == ) на неравенство ( != ), то получим результат "True!".

- Да и строки имеет смыл сравнивать только на Равенство ( == ) и Неравенство ( != ).