Namespaces
Variants

Logical operators

From cppreference.net

Логические операторы применяют стандартные операции булевой алгебры к своим операндам.

Оператор Название оператора Пример Результат
! логическое НЕ ! 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 + = b
a - = b
a * = b
a / = b
a % = b
a & = b
a | = b
a ^ = b
a <<= b
a >>= b

++ a
-- a
a ++
a --

+ a
- a
a + b
a - b
a * b
a / b
a % b
~a
a & b
a | b
a ^ b
a << b
a >> b

! a
a && b
a || b

a == b
a ! = b
a < b
a > b
a <= b
a >= b

a [ b ]
* a
& a
a - > b
a. b

a ( ... )
a, b
( type ) a
a ? b : c
sizeof


_Alignof
(начиная с C11)
(до C23)

alignof
(начиная с C23)

Смотрите также

Документация C++ для Логических операторов