Иногда я видел следующий код:
if ( !!on_debugging )
который является таким же, как
if ( on_debugging )
Я не понимаю, почему эти два! Есть ли какая-то разница?
!!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 имеет аналогичный синтаксис.)
!
на самом деле не возвращает логическое значение. Возвращает только int
0 или 1.
a(!0)
возвращает 2
, так как !0
имеет тип bool
.
Если operator!
не перегружается, оба утверждения эквивалентны.
Где !!
может быть полезно, если вам нужно изменить нулевое/ненулевое значение или значение nullptr
/non-null указателя в значение 0/1 в целочисленном выражении.
Для (сомнительного) примера следующий цикл подсчитывает количество ненулевых элементов в векторе:
for (size_t i = 0; i != v.size(); i++)
count += !!v[i];
Вы будете иногда видеть !!
в результате, в результате получается бит-уровень. Но в выражении if
вы показываете выше? Если только operator!
перегружен, что не является полезной операцией.
Основное отличие - глупое предупреждение от Visual C++.
Вторичные (редкие) различия включают случай, когда у вас есть operator!
, и случай, когда аргумент используется в небулевом контексте, например, арифметика.
Двойной! просто означает унарный NOT и еще один унарный нет. Смотрите это как (!(!on_debugging))
Да, вы правы, большую часть времени результаты такие же, как и on_debugging
. Я думаю, что это для точности или строгости использования !!
потому что !
оператор возвращает только integer 0 or 1
, что соответствует false
и true
. Хотя переменная может быть любой из типа int
и point
.
Должна быть какая-то форма перегрузки оператора иначе, это значит то же самое.
Возьмите это как живой пример:
#include <stdio.h>
int main(void) {
int a = 5;
printf("%d\n", a);
printf("%d\n", !!a); // will print 1
return 0;
}
Для Java !!on_debugging
- это противоположность !!!on_debugging
.
Вы можете отрицать материал так часто, как хотите, поэтому нет никакой разницы между on_debugging
и !!on_debugging
.
Также см. Спецификацию Java Language для этого оператора:
Тип выражения операндов унарного! оператор должен быть логическим или логическим, или возникает ошибка времени компиляции. (см. JLS 15.15.6).