Поверните значение на 1 или 0

Что?

!! обычно используется, если вы хотите преобразовать любое ненулевое значение в 1, будучи уверенным, что 0 останется 0.[1]

Унарный оператор ! (НЕ) превращает любое значение в ноль, если оно отлично от нуля, и в единицу, если оно равно нулю. Похоже на !!. Использование этого унарного оператора дважды превращает значение в единицу, если оно не равно нулю, и остается равным нулю, если оно равно нулю.

Звучит сложно? Давайте посмотрим, как это работает, на следующих примерах.

#include <stdio.h>

int main()
{
    printf("!0        -> %d,   !!0        -> %d         // integer zero\n", !0, !!0);
    printf("!1        -> %d,   !!1        -> %d         // integer one\n", !1, !!1);
    printf("!2        -> %d,   !!2        -> %d         // positive integer\n", !2, !!2);
    printf("!-1       -> %d,   !!-1       -> %d         // negative integer\n", !-1, !!-1);
    printf("!0.5      -> %d,   !!0.5      -> %d         // floating point number\n", !0.5, !!0.5);
    printf("!'A'      -> %d,   !!'A'      -> %d         // char\n", !'A', !!'A');
    
    char arry[10] = {0};
    char *null_ptr = NULL;
    
    printf("!arry     -> %d,   !!arry     -> %d         // array\n", !arry, !!arry);
    printf("!null_ptr -> %d,   !!null_ptr -> %d         // null pointer\n", !null_ptr, !!null_ptr);
    
    return 0;
}

Результат будет:

!0        -> 1,   !!0        -> 0         // integer zero
!1        -> 0,   !!1        -> 1         // integer one
!2        -> 0,   !!2        -> 1         // positive integer
!-1       -> 0,   !!-1       -> 1         // negative integer
!0.5      -> 0,   !!0.5      -> 1         // floating point number
!'A'      -> 0,   !!'A'      -> 1         // char
!arry     -> 0,   !!arry     -> 1         // array
!null_ptr -> 1,   !!null_ptr -> 0         // null pointer

Ууууу! Вот. Операторы ! и !! переводят все типы переменных в целочисленный тип со значением 0 или 1. Вы также можете проверить это онлайн с помощью Online C Compiler — онлайн-редактор.

Почему?

Теперь мы знаем, как двойной восклицательный знак («!!») работает в C. Но почему? Зачем нам это нужно?
Иногда компилятор выдавал предупреждения или ошибки, если мы используем оператор if для истинного или ложного значения с нелогическим или нецелочисленным значением. Или, если вы хотите вернуть 1 или 0 с типом integer из-за объявления функции, помимо приведения возвращаемого значения с помощью (int), вы также можете использовать !! для преобразования типа в целое число.

Как правило, это совет, который порадует компилятор, особенно в мире встраиваемых систем.

Удачного кодирования!

Ссылка

  1. "Что "!!" в С? [дубликат] — Stack Overflow»
  2. c: двойной восклицательный знак — одурманить разработчика
  3. "Что !! (двойной восклицательный знак) на языке C? — Совет С»