Оператор двойного логического отрицания

Я наткнулся на этот фрагмент кода из реализации GSL (Библиотека поддержки рекомендаций C ++) от Microsoft:

#if defined(__clang__) || defined(__GNUC__)
#define GSL_LIKELY(x) __builtin_expect(!!(x), 1)
#define GSL_UNLIKELY(x) __builtin_expect(!!(x), 0)
#else
#define GSL_LIKELY(x) (!!(x))
#define GSL_UNLIKELY(x) (!!(x))
#endif

Я читал о __builtin_expect (здесь и здесь), но мне все еще неясно, какова цель оператора двойного логического отрицания в (!!(x)). Почему это используется?

Рассматриваемый файл - этот.


person Nick    schedule 17.02.2018    source источник
comment
@dhke Этот ответ можно адаптировать для C ++. В операторе C ++! вернуть логическое значение.   -  person Oliv    schedule 17.02.2018
comment
Почему этот вопрос помечен как C, когда контекст - это строго библиотека C ++?   -  person Jonathan Leffler    schedule 17.02.2018


Ответы (1)


__builtin_expect работает со строгим равенством, поэтому точка двойного отрицания здесь состоит в том, чтобы убедиться, что все истинные значения преобразованы в 1 (и, таким образом, соответствуют 1 в GSL_LIKELY), а все ложные значения соответствуют 0 в GSL_UNLIKELY.

Двойное отрицание сохраняется, даже если __builtin_expect недоступен для сохранения единообразия (так как вызывающий может сохранить возвращаемое значение для других целей, кроме как условие в if).

person Matteo Italia    schedule 17.02.2018