Что означает !! (x) в C (особенно ядро ​​Linux)? - PullRequest
23 голосов
/ 27 марта 2010

Я читал через ядро ​​Linux (в частности, 2.6.11). Я наткнулся на следующее определение:

#define unlikely(x)     __builtin_expect(!!(x), 0)

(из linux-2.6.11 / include / linux / compiler.h: 61 ссылка lxr )

Что значит !! достичь? Почему бы просто не использовать (х)?

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

Ответы [ 3 ]

30 голосов
/ 27 марта 2010

!!(x) заставляет его быть либо 0, либо 1. 0 остается 0, но любое ненулевое значение (которое будет «истинным» в логическом контексте) становится 1.

11 голосов
/ 27 марта 2010

Это не столько синтаксис языка, сколько общий способ преобразования char или int в квази-логическое значение.

В C логические операции, такие как == &&! и т. д. могут действовать на int, char и т. д., поскольку логического типа не существует, однако в соответствии со стандартом они гарантированно возвращают 0 для False и 1 для true.

Так, например, если у вас есть

int x = 5;

вы можете принудительно преобразовать его в "логический" тип (в C нет логического типа, следовательно, в кавычках), который вы делаете

x = !x; /* !5 which gives 0 always */
x = !x; /* which gives 1 always */
8 голосов
/ 27 марта 2010

!!(x) эквивалентно (x) != 0 (если в C ++ не происходит какой-либо очень странной перегрузки операторов).

Тот факт, что !!(x) делает неочевидным, вероятно, является хорошей причиной для использования (x) != 0. Если вы не хотите быть хакером элитного ядра.

См. этот закрытый вопрос (если он еще есть) для обсуждения достоинств !! (возможно, этот вопрос будет вновь открыт, поскольку этот вопрос указывает на то, что он имеет какое-то значение ).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...