Логические операторы
Логические операторы применяют к своим операндам стандартные операции булевой алгебры.
| Оператор | Название оператора | Пример | Результат |
|---|---|---|---|
! | логическое НЕ |
!a | логическое отрицание a |
&& | логическое И |
a && b | логическое И для a и b |
|| | логическое ИЛИ |
a || b | логическое ИЛИ для a и b |
Логическое НЕ
Логическое выражение НЕ имеет вид
! expression |
где
| expression | - | выражение любого скалярного типа |
Оператор логического НЕ имеет тип 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); // not true
printf("!(2+2==4) = %s\n", b ? "true" : "false");
int n = isspace('a'); // non-zero if 'a' is a space, zero otherwise
int x = !!n; // "bang-bang", common C idiom for mapping integers to [0,1]
// (all non-zero values become 1)
char *a[2] = {"non-space", "space"};
puts(a[x]); // now x can be safely used as an index to array of 2 strings
}
Вывод:
!(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) // common C idiom: if p is not null
// AND if p does not point at the end of the string
{ // (note that thanks to short-circuit evaluation, this
// will not attempt to dereference a null pointer)
// ... // ... then do some string processing
}
}
Логическое ИЛИ
Логическое выражение ИЛИ имеет вид
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 Оператор логического И (с. 99)
- 6.5.14 Оператор логического ИЛИ (с. 99)
- Стандарт C99 (ISO/IEC 9899:1999):
- 6.5.3.3 Унарные арифметические операторы (с. 79)
- 6.5.13 Оператор логического И (с. 89)
- 6.5.14 Оператор логического ИЛИ (с. 89)
- Стандарт C89/C90 (ISO/IEC 9899:1990):
- 3.3.3.3 Унарные арифметические операторы
- 3.3.13 Оператор логического И
- 3.3.14 Оператор логического ИЛИ
См. также
| Распространённые операторы | ||||||
|---|---|---|---|---|---|---|
| присваивание |
инкремент декремент | арифметические | логические | сравнения |
доступ к членам | прочие |
|
|
|
|
|
|
|
|
См. также
| Документация по C++ для логических операторов |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/c/language/operator_logical