2014-08-13 2 views
11

Я просто нашел в файле Microsoft, guiddef.h заголовка:Логический !! против ничего

__inline bool operator==(REFGUID guidOne, REFGUID guidOther) 
{ 
    return !!IsEqualGUID(guidOne,guidOther); 
} 

Есть ли смысл в !! или был какой-DEV просто чувство мило, что день?

+4

Это обычный способ [нормализовать значения до 0 или 1] (http://stackoverflow.com/a/20916491/1708801), он также дает вам преобразование в интегральный тип. –

+0

Связанный http://stackoverflow.com/q/1310344/57428 – sharptooth

+0

Это, вероятно, не следует помечать как C, так как 'operator ==' специфичен для C++. –

ответ

13

Он отключает визуальное предупреждение C++ о глухом представлении для преобразования в boolean.

+1

Yeap, предупреждение C4800. Они могли бы также использовать 'return IsEqualGUID (guidOne, guidOther)! = 0;', который эффективно делает то же самое. – sharptooth

+0

@sharptooth: Что касается вопроса о том, почему '! = 0' не является общим соглашением, он имеет разницу в приоритетах и ​​размещении и не поддается визуальному распознаванию. Поэтому есть веские причины, по которым они не могли так же хорошо это сделать. Они могли это сделать технически, да, но не так. ;-) –

+0

Учитывая семантику стандартного типа C++ 'bool', ни' !! ', ни'! = 0' не требуется; преобразование будет выполняться неявно, и оно будет вести себя так же, как '!!'. Код, или, по крайней мере, идиома, может появиться до того, как C++ имел 'bool' как встроенный тип или, по крайней мере, до того, как он поступил так же, как в современном C++. Явное преобразование в 'bool' (с учетом того, что лучший вкус литого является наиболее подходящим), возможно, было более ясным и, вероятно, также заблокировало бы предупреждение. –

5

В этом конкретном случае Alf, вероятно, прав.

В противном случае принято стандартизировать целочисленные значения для 1 (если они начинаются с нуля) или 0 (если они начинаются как ноль) для логических операций.

Смежные вопросы