2013-12-12 3 views
0

Иногда я видел следующий код:В чем разница! и ничего?

, которая является такой же, как

if (on_debugging) 

Я не понимаю, почему эти два используются s!. Есть ли какая-то разница?

+2

Единственное, что приходит на ум, это тот оператор! может быть перегружен. – Spook

+0

@Spook: меня то же самое – David

+0

В этом случае это не так. – jaeyong

ответ

2

Если operator! не перегружен, эти два утверждения эквивалентны.

Где !! может быть полезно, если вам нужно изменить нулевое/ненулевое значение или значение nullptr/ненулевое значение указателя в значение 0/1 в целочисленном выражении.

Для (сомнительного) Например, следующий цикл подсчитывает количество ненулевых элементов в векторе:

for (size_t i = 0; i != v.size(); i++) 
    count += !!v[i]; 

Вы иногда видеть !! в хаков битового уровня в качестве результата. Но в заявлении if вы показываете выше? Если operator! перегружен, это не является полезной операцией.

0

Там должен быть какой-либо формой перегрузки оператора другим, это значит то же самое.

7

!!a почти эквивалентен a. Он преобразует его в логическое значение.

Обычно это не имеет значения, но иногда это происходит.

#include <iostream> 

int a(int x) { 
    return 1; 
} 

int a(bool x) { 
    return 2; 
} 


int main() { 
    std::cout << a(0) << std::endl; //prints 1 
    std::cout << a(!!0) << std::endl; //prints 2 

    std::cout << -1 << std::endl; //prints -1 
    std::cout << !!-1 << std::endl; //prints 1 

} 

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

(FYI, это делается даже чаще в Javascript из его типов, например, false != null но false == !!null. Я включаю этот комментарий, потому что вы добавили на вопрос . с C, C++ и Java, а также акций Javascript аналогичный синтаксис)

+0

'!' Фактически не возвращает логическое значение. Он возвращает только 'int' 0 или 1. –

+0

@ richard.g, я прошу отличаться. В моем примере 'a (! 0)' возвращает '2', так как'! 0' имеет тип 'bool'. –

+1

Тип возврата '!' Отличается на C и C++. В C это 'int' (значение' 0' или '1') в C++ - это' bool'. Этот вопрос помечен для обоих языков. –

0

Возьмите это как live пример:

#include <stdio.h> 

int main(void) { 
    int a = 5; 

    printf("%d\n", a); 
    printf("%d\n", !!a); // will print 1 

    return 0; 
} 
0

Основное отличие заключается в глупое-предупреждение от Visual C++.

Вторичные (редкие) отличия включают случай, когда у вас есть operator!, и случай, когда аргумент используется в небулевом контексте, например. арифметика.

0

Двойной! просто означает унарный NOT и еще один унарный нет. См. Его как (!(!on_debugging))

Да, вы правы, большую часть времени результаты такие же, как и on_debugging. Я думаю, что для точности или строгости использовать !!, поскольку оператор ! возвращает integer 0 or 1, что соответствует false и true. Хотя переменная может быть любой из int и point типа.

-1

Для Java !!on_debugging - противоположность !!!on_debugging.

Вы можете отрицать материал так часто, как хотите, поэтому нет никакой разницы между on_debugging и !!on_debugging.

Также см Спецификация языка Java для этого оператора:

типа выражения операнда одинарных! оператор должен быть boolean или Boolean, или возникает ошибка времени компиляции. (see JLS 15.15.6).

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