Логические операторы
Логические операторы применяют стандартные операции булевой алгебры к своим операндам.
| Оператор | Название оператора | Пример | Результат |
|---|---|---|---|
! |
логическое НЕ | !a |
логическое отрицание a |
&& |
логическое И | a && b |
логическое И a и b |
|| |
логическое ИЛИ | a || b |
логическое ИЛИ a и b |
Логическое НЕ
Выражение логического НЕ имеет вид
! выражение |
где
| выражение | - | выражение любого скалярного типа |
Оператор логического НЕ имеет тип int. Его значение равно 0 , если выражение вычисляется в значение, не равное нулю. Его значение равно 1 , если выражение вычисляется в значение, равное нулю. (поэтому !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'); // zero if 'a' is a space, nonzero otherwise
int x = !!n; // "bang-bang", common C idiom for mapping integers to [0,1]
// (all non-zero values become 1)
char *a[2] = {"nonspace", "space"};
printf("%s\n", a[x]); // now x can be safely used as an index to array of 2 ints
}Вывод:
!(2+2==4) = false nonspace
Логическое И
Выражение логического И имеет вид
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/w/c/language/operator_logical