Что делает!! (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)?

См. также:

23
задан Community 23 May 2017 в 12:18
поделиться

3 ответа

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

30
ответ дан 29 November 2019 в 01:38
поделиться

Это не столько синтаксис языка, сколько обычное сокращение для преобразования 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 */
11
ответ дан 29 November 2019 в 01:38
поделиться

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

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

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

8
ответ дан 29 November 2019 в 01:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: