Почти во всех языках программирования программист при написании программы может использовать условия в качестве рычагов управления программой. В зависимости от результата: выполнение или невыполнение условия — программа ведёт себя так, как описывал программист.
В С++ есть три логические операции: логическое И, логическое ИЛИ, логическое отрицание. Они помогают создавать сложные условия из простых.
Использование этих логических операций напоминает человеческое мышление. Прочитать человек любую из этих операций может очень легко. В разных языках программирования они могут обозначаться по-разному. В языке C++ эти операции обозначаются так:
Логическое ИЛИ
||
Общее условие считается выполненным, если хотя бы одна из проверок даёт положительный результат
Логическое И
&&
Общее условие считается выполненным только если все проверки прошли успешно
Логическое отрицание
!
Общее условие считается выполненным, если результатом проверки оказывается ложное утверждение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <iostream.h>
#include <conio.h>
intmain(){
clrscr();
inta,b;//Два целых числа
cout<<"input a: ";
cin>>a;
cout<<"input b: ";
cin>>b;
/*ПРИМЕНЕНИЕ ЛОГИЧЕСКИХ ОПЕРАЦИЙ*/
//Применение логического ИЛИ
if(a==100||b==100){//Основное условие состоит из двух простых проверок на равенство, объединённых операцией ИЛИ
cout<<"a == 100 || b == 100";//Если хотя бы одно условие выполнено, то выводим на экран, что или "a", или "b" равно 100
}else{
cout<<"a != 100 && b != 100";//В противном случае выводим на экран, что ни "a", ни "b" не равны 100
}
cout<<'\n';
//Применение логического И
if(a==100&& b == 100){ //Основное условие состоит из двух простых проверок на равенство, объединённых операцией И
cout << "a == 100 && b == 100";//Только если все условия верны, то выводим на экран, что и "a", и "b" равны 100
}else{
cout<<"(or a, or b) != 100";//В противном случае выводим на экран, что то ли "a", то ли "b" не равно 100
}
cout<<'\n';
cin.get();
}
В приведённой программе вы должны ввести два числа. Первое число будет храниться в переменной "a", второе в "b", будет производиться проверка, что первое число 100 и что второе число 100, или что первое число 100 или второе число 100. В зависимости от результатов проверки будут выводиться разные результаты.
Чаще всего логическое отрицание используют для того, чтобы проверить, что проверяемое или ноль, или false.
Очень часто пишут неполное выражение:
C++
1
if(a>b){что-тоделать}
На самом деле это в полной версии выглядит так:
C++
1
if(a>b==true){что-тоделать}
Смысл в том, что если условие верно, то true можно пропускать, делая код короче, чем, собственно, все пользуются. Иногда нужно перевернуть всё с ног на голову и заявить о том, что для выполнения какого-то блока кода, проверяемое условием выражение должно оказаться ложным, в таком случае используют операцию отрицания:
C++
1
if(!(a>b)){что-тоделать}
На самом деле это в полной версии выглядит так:
C++
1
if((a>b)==false){что-тоделать}
Все три логические операции отдают результат своих действий, результатом может обозначаться только два варианта исхода: или утверждение справедливо, или утверждение неверно. В случае верности утверждения мы получим 1, в случае неверности получим 0:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream.h>
#include <conio.h>
intmain(){
cout<<(7<0)<<'\n';//0, потому что неверно, что утверждение справедливо
cout<<(7>0)<<'\n';//1, потому что верно, что утверждение справедливо
cout<<(7==0)<<'\n';//0, потому что неверно, что утверждение справедливо
/*В случае логического отрицания всё происходит наоборот*/
cout<<!(7<0)<<'\n';//1, потому что верно, что утверждение ложно
cout<<!(7>0)<<'\n';//0, потому что неверно, что утверждение ложно
cout<<!(7==0)<<'\n';//1, потому что неверно, что утверждение ложно (if (7==0) == false)
}
Используя логические операции, можно составлять сложные проверки:
Но при составлении сложных условий и даже при использовании логического отрицания первое время стоит использовать круглые скобки, чтобы наверняка знать в каком порядке выполнятся проверки. При отсутствии круглых скобок первыми выполняются операции логического отрицания, вторыми операции логического И, третьими операции логического ИЛИ. Это несложно запомнить: логическое И как умножение, логическое ИЛИ как сложение, а логическое отрицание первая в тройке.
C++
1
2
3
4
5
6
inta=10;
intb=0;
//Зависимость от порядка действий
cout<<(!a&& b) << '\n';
cout<<(!(a&& b)) << '\n';
Эта зависимость происходит из порядка выполнения операций, о котором говорилось буквально только что. Поэтому лучше первое время используйте круглые скобки, как вы могли бы это делать в обычных арифметических примерах.
В современных компиляторах давно существует специальный тип для работы с булевыми значениями, тип bool, в старых компиляторах этого типа не было. В старых компиляторах обходились нулём или не нулём, если ноль, то это обозначало ложь, если не ноль, то истину. Много компиляторов давно поддерживает тип bool, переменные этого типа могут неявно приводиться к целому значению, в случае неявного приведения они оказываются или нулём (если ложь), или единицей (если истина). Поэтому объект cout выводит ноль или единицу в зависимости от справедливости высказывания.
Подводим промежуточные итоги:
В С++ существует только три логические операции: И (&&), ИЛИ (||), НЕ (!)
Каждая из трёх операций производит нам результат: верно или неверно.
Для выяснения правильности всех проверок используется операция И
Для выяснения правильности хотя бы одной проверки используется операция ИЛИ
Для выяснения неправильности утверждения используется операция НЕ, которой можно выявить или 0, или false
У логических операций есть определённый порядок приоритетов: первой выполняется операция логического отрицания, второй выполняется операция логического И, третьей выполняется операция логического ИЛИ
Иногда новички по ошибке используют не логические операции, а битовые. Битовые операции отличаются от логических операций, хотя по результатам работы и способу их использования можно говорить о схожести логических и битовых операций. Важное отличие логических операций от битовых в том, что логические операции возвращают нам значение булева типа, т. е. либо истину, либо ложь, а битовые операции возвращают нам число. Другое важное отличие логических операций от битовых в том, что у логических операций порядок выполнения проверок происходит слева-направо, а у битовых операций порядок проверок не определён.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
usingstd::cout;
intmain(){
if(1==(10& 10 ) ){ //Новичок перепутал логическое И с битовым И
cout << "true" << '\n';
}
else{
cout<<"false"<<'\n';//Получился false
}
if(1==(10&& 10 ) ){ //Новичок хотел, чтобы
cout << "true" << '\n';//получился true
}
else{
cout<<"false"<<'\n';
}
}
Такие ошибки очень сложно выявлять, потому что код работает. С точки зрения компилятора код написан правильно, ведь он, компилятор, не может знать, что вы задумывали, поэтому и ошибок таких компилятор не распознает. А вот найти такую засаду бывает очень сложно. Поэтому, если вы не работаете с битами (если вы работаете с битами, то об этом будете знать), то будьте внимательны к написанию логических операций. Логические операции вы будете очень часто использовать в ветвлениях if для проверки выполнения условий и в циклах, определяя до каких пор циклы должны будут работать.
Некоторые люди включают XOR в логические операции. Не верьте тем людям. Они меня как-то тоже ввели в заблуждение, а я вводил в заблуждение своих читателей, это очень плохо. XOR — это битовая операция. В этой статье битовые операции не рассматриваются.
Добавить комментарий