Spec-Zone.ru › C

Логические операторы

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

Оператор Название оператора Пример Результат
! логическое НЕ !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 Оператор логического ИЛИ

См. также

Приоритет операторов

Распространённые операторы
присваивание инкремент
декремент
арифметические логические сравнения доступ к
членам
прочие

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++ для логических операторов

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/c/language/operator_logical

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API