В чем разница между !! и ничего? [Дубликат]

0

Иногда я видел следующий код:

if ( !!on_debugging ) 

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

if ( on_debugging )

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

  • 2
    Единственное, что приходит мне в голову - это оператор! может быть перегружен.
  • 0
    @Spook: мне тоже самое
Показать ещё 8 комментариев
Теги:

7 ответов

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 .
Показать ещё 3 комментария
2

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

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

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

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

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

0

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

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

0

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

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

0

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

0

Возьмите это как живой пример:

#include <stdio.h>

int main(void) {
  int a = 5;

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

  return 0;
}
-1

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

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

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

Тип выражения операндов унарного! оператор должен быть логическим или логическим, или возникает ошибка времени компиляции. (см. JLS 15.15.6).

Ещё вопросы

Сообщество Overcoder
Наверх
Меню