НЕ (~) против НЕГАТИРОВАНИЯ (!)
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
int i=-5;
while(~(i))
{
cout<<i;
++i;
}
}
Выход -5, -4, -3, -2.
Не следует ли печатать значения до -1? Почему это только до -2.
И, пожалуйста, объясните мне разницу между операторами "не" и "отрицанием". Когда я пишу программу, они были источником ошибок.
while(i)
Я знаю, что условие цикла будет истинным для положительного и отрицательного i, кроме 0.
while(!i) vs while(~i)
Для каких значений 'i' выполняются две указанные выше петли?
Ответы
Ответ 1
Когда i
получает значение -1
, значение ~i
равно ~-1
или 0
, поэтому цикл while
прекращает выполнение. Оператор !
работает, потому что он делает что-то совершенно другое; это приводит к 1
для значений 0
и 0
для всех других значений. ~
- побитовое отрицание.
Немного подробнее:
-
~
принимает каждый бит в числе и переключает его. Так, например, 10010 2 станет 01101 2
-
-1
- все единицы в двоичном формате, когда целое число с двумя дополнениями.
-
~0b…11111111
0
.
Однако:
-
!0
1
, !anythingElse
есть 0
-
-1
не 0
-
!-1
все еще 0
И если вы действительно хотите включить цикл, включая i == -1
, просто используйте while (i)
вместо while (~i)
.
Ответ 2
Вы правы в i == -1
, являющемся условием выхода: ваш цикл эквивалентен
int i=-5;
while(i != -1)
{
cout<<i;
++i;
}
// i == -1 immediately after the loop
При написании этого способа должно быть понятно, почему -1
не печатается, значение сначала печатается и только затем увеличивается, поэтому -2
- это последнее значение, которое вы печатаете.
Оператор !
, с другой стороны, произведет 1
только тогда, когда ему будет дан ноль. Поэтому цикл будет печатать -1
, когда оператор !
используется в условии цикла.
Ответ 3
'~' - это оператор: ~ x = -x-1
и при я = -1, то ~ я = 0.
если вам интересно значение ~ i, вы можете просто распечатать их:
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
int i=-5;
for (int i = -5; i <= 3; i++)
{
cout<<i<<" "<<(~i)<<endl;
}
}
а затем вы найдете:
-5 4
-4 3
-3 2
-2 1
-1 0
0 -1
1 -2
2 -3
3 -4