2011-12-15 3 views
1

Можно создать дубликат:
Double Negation in C++ codeЧто значит !! в C - и зачем он нужен?

Во время чтения одного кода я прочитал:

flush = ! !(flags & GST_SEEK_FLAG_FLUSH); 

Я не получаю то, что это значит !! здесь. Что делает это предложение?

EDIT:

Я получил его сво двойной отрицательный. трюк для преобразования данных non-bool в bool

Но в чем же это необходимость? Здесь flush - bool, тогда, если вы назначите любой ненулевой элемент для bool, он будет обрабатывать как 1, так и нулевой элемент как 0, так что это полезно?

+0

Возможно, кто-то путал логическое NOT ('!') С побитовым NOT ('~')? –

+0

но что нужно от этого ??? здесь flush is bool, тогда, если вы назначите любой ненулевой элемент для bool, он будет обрабатывать как 1 и zero iteam как 0, так что это полезно? –

+0

@ Mr.32 Используется для проверки того, установлен ли бит 'GST_SEEK_FLAGS_FLUSH' в переменной' flags'. –

ответ

9

Это двойной отрицательный. Это способ преобразования выражения non-bool в обратном направлении (например, flags & GST_SEEK_FLAG_FLUSH) в bool. Я лично предпочитаю:

flush = (flags & GST_SEEK_FLAG_FLUSH) != 0;

+0

, но что нужно от этого? здесь flush is bool, тогда, если вы назначите любой ненулевой элемент для bool, он будет обрабатывать как 1 и zero iteam как 0, так что это полезно? –

+1

@ Mr.32 Возможно позже ... 'if (1 == flush) {...}'. Потому что иногда «bool условная проверка» выполняется явно с допущениями (и все мы знаем, что предположения ... ;-), неявно как 'if (flush) {...}'. Кроме того, 'flush' может использоваться в совершенно другом контексте, где он * должен * быть 1/0, чтобы отражать действительное значение, поэтому предыдущий был всего лишь одним примером. «Лучше безопасно, чем жаль», и, будучи последовательным, минимизирует «извините» позже :) –

+0

Да, это просто гарантия, что это законное значение bool, а не просто просто ненулевое значение. Тем не менее, он запутывает код, поэтому я согласен, что это выглядит глупостью, поэтому я предпочитаю версию, которую я опубликовал. Он правильно превращает его в bool, и он * выглядит * подобно тому, как его ожидают мозги. –

2

Просто хотел добавить немного пример для вас, что может очистить вещи.

main() 
{ 
int i=10; 
printf("%d",!!i); 
} 

Выход 1

+0

, но что нужно от этого? здесь flush is bool, тогда, если вы назначите любой ненулевой элемент для bool, он будет обрабатывать как 1 и zero iteam как 0, так что это полезно? –

2

Если flush является булевой переменной, а вы заставляете некоторые не-булево значение для него, некоторые компилятор будет генерировать предупреждение принуждая значение BOOL «истина» или «ложь» , Так что безопаснее использовать двойное отрицание.

2

Некоторые компиляторы (как Visual Studio) будет предупреждать, когда понуждения без логического типа к междунар, например:

#include <stdio.h> 

int main(void) { 
    int x = 10; 
    bool y = x; // warning C4800: 'int' : forcing value to bool 'true' or 'false' (performance warning) 
    return 0; 
} 

Двойное отрицание трюк является одним из способов преобразования в BOOL и предотвращения этого предупреждения , однако я бы наклонился к отметке != 0, которую Джим Бак рекомендовал для ясности.

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

  • Нет связанных вопросов^_^