web-dev-qa-db-ja.com

NOT(〜)vs NEGATION(!)

#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つのループが実行されますか?

21
tez

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)を使用してください。

36
Ry-

i == -1が終了条件であることは正しい:あなたのループは

int i=-5;
while(i != -1)
{
    cout<<i;
    ++i;
}
// i == -1 immediately after the loop

このように書くと、なぜ-1が印刷されないのかが明確になり、値が最初に印刷されてから増分されるので、-2が最後に印刷される値になります。

一方、!演算子は、ゼロが指定された場合にのみ1を生成します。ループ条件で-1演算子が使用されている場合、ループは!を出力します。

5
dasblinkenlight

「〜」は次の演算子です:〜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

2
aasa