Что означает (x) в C (например, ядро ​​Linux)?

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

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

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

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

См. также:

Ответы

Ответ 1

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

Ответ 2

Это не столько синтаксис языка, сколько общее сокращение для преобразования 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 */

Ответ 3

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

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

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