#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です。そして、私の違いを説明してください「ではない」と「否定」今まで私は、彼らはバグの源だったプログラムを書くoperators.When。
while(i)
私は、ループ条件iが0以外だ正と負のために真であることがわかっています。
while(!i) vs while(~i)
「i」のどの値に対して、上記の2つのループが実行されますか?
i
が_-1
_に達すると、_~i
_の値は_~-1
_または_0
_になるため、while
ループは実行を停止します。 _!
_演算子は、まったく異なることを行うため機能します。 _1
_値の場合は_0
_になり、他のすべての値の場合は_0
_になります。 _~
_はビットごとの否定です。
もう少し詳しく:
~
_は、数値の各ビットを取得して切り替えます。したがって、たとえば、100102 01101になります2-1
_は、2の補数の符号付き整数の場合、すべてバイナリの1です。~0b…11111111
_は_0
_です。しかしながら:
!0
_は_1
_、_!anythingElse
_は_0
_です-1
_は_0
_ではありません!-1
_はまだ_0
_ですまた、実際に_i == -1
_を含むループを作成する場合は、while (i)
の代わりにwhile (~i)
を使用してください。
i == -1
が終了条件であることは正しい:あなたのループは
int i=-5;
while(i != -1)
{
cout<<i;
++i;
}
// i == -1 immediately after the loop
このように書くと、なぜ-1
が印刷されないのかが明確になり、値が最初に印刷されてから増分されるので、-2
が最後に印刷される値になります。
一方、!
演算子は、ゼロが指定された場合にのみ1
を生成します。ループ条件で-1
演算子が使用されている場合、ループは!
を出力します。
「〜」は次の演算子です:〜x = -x-1およびi = -1の場合、〜i =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