Logical operators
Логические операторы применяют стандартные операции булевой алгебры к своим операндам.
| Оператор | Название оператора | Пример | Результат |
|---|---|---|---|
| ! | логическое НЕ | ! a | логическое отрицание a |
| && | логическое И | a && b | логическое И a и b |
| || | логическое ИЛИ | a || b | логическое ИЛИ a и b |
Содержание |
Логическое НЕ
Логическое выражение NOT имеет вид
!
выражение
|
|||||||||
где
| expression | - | выражение любого scalar type |
Логический оператор НЕ имеет тип int . Его значение равно 0 , если expression вычисляется в значение, которое сравнивается как неравное нулю. Его значение равно 1 , если expression вычисляется в значение, которое сравнивается как равное нулю. (таким образом ! E эквивалентно ( 0 == E ) )
#include <stdbool.h> #include <stdio.h> #include <ctype.h> int main(void) { bool b = !(2+2 == 4); // не истина printf("!(2+2==4) = %s\n", b ? "true" : "false"); int n = isspace('a'); // ненулевое значение, если 'a' является пробелом, иначе ноль int x = !!n; // "двойное отрицание", распространённая C идиома для отображения целых чисел в [0,1] // (все ненулевые значения становятся 1) char *a[2] = {"non-space", "space"}; puts(a[x]); // теперь x можно безопасно использовать как индекс для массива из 2 строк }
Вывод:
!(2+2==4) = false non-space
Логическое И
Логическое выражение И имеет вид
lhs
&&
rhs
|
|||||||||
где
| lhs | - | выражение любого скалярного типа |
| rhs | - | выражение любого скалярного типа, которое вычисляется только если lhs не равно 0 |
Логический оператор И имеет тип int и значение 1 если оба операнда lhs и rhs не равны нулю. Он имеет значение 0 в противном случае (если либо lhs , либо rhs , либо оба равны нулю).
Существует точка следования после вычисления lhs . Если результат lhs оказывается равным нулю, то rhs не вычисляется вовсе (так называемое сокращённое вычисление )
#include <stdbool.h> #include <stdio.h> int main(void) { bool b = 2+2==4 && 2*2==4; // b == true 1 > 2 && puts("this won't print"); char *p = "abc"; if(p && *p) // распространённая C-идиома: если p не нулевой // И если p не указывает на конец строки { // (заметьте, что благодаря сокращённому вычислению, // это не приведёт к разыменованию нулевого указателя) // ... // ... тогда выполнить обработку строки } }
Логическое ИЛИ
Логическое выражение ИЛИ имеет вид
lhs
||
rhs
|
|||||||||
где
| lhs | - | выражение любого скалярного типа |
| rhs | - | выражение любого скалярного типа, которое вычисляется только если lhs равно 0 |
Логический оператор ИЛИ имеет тип int и значение 1 если либо lhs либо rhs не равны нулю. Он имеет значение 0 в противном случае (если оба lhs и rhs равны нулю).
Существует точка следования после вычисления lhs . Если результат lhs оказывается неравным нулю, то rhs не вычисляется вовсе (так называемое сокращённое вычисление )
#include <stdbool.h> #include <stdio.h> #include <string.h> #include <errno.h> int main(void) { bool b = 2+2 == 4 || 2+2 == 5; // true printf("true or false = %s\n", b ? "true" : "false"); // logical OR can be used simialar to perl's "or die", as long as rhs has scalar type fopen("test.txt", "r") || printf("could not open test.txt: %s\n", strerror(errno)); }
Возможный вывод:
true or false = true could not open test.txt: No such file or directory
Ссылки
- Стандарт C11 (ISO/IEC 9899:2011):
-
- 6.5.3.3 Унарные арифметические операторы (стр. 89)
-
- 6.5.13 Логический оператор AND (стр. 99)
-
- 6.5.14 Логический оператор OR (стр. 99)
- Стандарт C99 (ISO/IEC 9899:1999):
-
- 6.5.3.3 Унарные арифметические операторы (стр. 79)
-
- 6.5.13 Логический оператор AND (стр. 89)
-
- 6.5.14 Логический оператор OR (стр. 89)
- Стандарт C89/C90 (ISO/IEC 9899:1990):
-
- 3.3.3.3 Унарные арифметические операторы
-
- 3.3.13 Логический оператор AND
-
- 3.3.14 Логический оператор OR
Смотрите также
| Общие операторы | ||||||
|---|---|---|---|---|---|---|
| присваивание |
инкремент
декремент |
арифметические | логические | сравнения |
доступа к членам
доступа |
другие |
|
a
=
b
|
++
a
|
+
a
|
!
a
|
a
==
b
|
a
[
b
]
|
a
(
...
)
|
Смотрите также
|
Документация C++
для
Логических операторов
|