Подтвердить что ты не робот

Что "!!" в C?

Я обнаружил следующий фрагмент:

pt->aa[!!(ts->flags & MASK)] = -val;
  • Что означает !! (двойные восклицательные знаки/восклицательные знаки/два не оператора) в c?
  • Не (!!NULL) == NULL?
4b9b3361

Ответ 1

! является отрицанием. Итак, !! - отрицание отрицания. Важно то, что результатом будет int.

  • !!x, если x == 0 - !!0, то есть !1, то есть 0.
  • !!x, если x != 0 - !!(!0), то есть !!1, то есть !0, то есть 1.

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

И действительно, !!NULL == NULL, так как !!NULL == !!0 и !!0 == !1 и, наконец, !1 == 0.

Следовательно, в короткой части кода, которую вы указали, индекс массива будет либо 0, если значение выражения в скобках NULL, а 1 в противном случае.

Ответ 2

Обычно (ab) используется для преобразования любого значения в int 0 или 1 путем повторного применения булевого оператора, !.

Например: !56 равно 0, поскольку 56 является "истинным", если рассматривать его как логическое. Это означает, что !!56 равно 1, так как !0 равно 1.

Ответ 3

!E совпадает с E == 0, поэтому !!E совпадает с (E == 0) == 0. !! используется для нормализации булевых значений.

Ответ 4

В C99 вы можете заменить его на

#include <stdbool.h>


pt->aa[(bool)(ts->flags & MASK)] = -val;

Конечно, если ваш код будет переносимым на C89, тогда вам будет лучше делать!! трюк или

pt->aa[(ts->flags & MASK)!=0] = -val;

или

pt->aa[(ts->flags & MASK)?1:0] = -val;

Сгенерированный код будет, безусловно, идентичным.

Ответ 5

Он преобразует число в каноническое булево.

Обратите внимание, что в этом случае это очень важно, так как результат используется для индексации массива.

Ответ 6

  • !!x - это просто !(!x).
  • если NULL определяется как 0, то !!NULL == !!0 == !(!0) == !(1) == 0.

Ответ 7

!! является достойным способом успокоить компилятор в определенных ситуациях, таких как назначение в условном выражении с более чем одним выражением, например:

int _blah = 100;
int *blah;
if ( _blah > 100 && !!(blah = &_blah) ) {
// do stuff
}

Я не рекомендую этого - обычно предупреждают, чтобы обеспечить хорошую практику кодирования.