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