28
#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までしか出力しないのですか?また、「not」演算子と「negation」演算子の違いを説明してください。プログラムを作成するときは常に、バグの原因でした。

while(i)

ループ条件は、0を除く正と負のiに対して真になることを知っています。

while(!i) vs while(~i)

上記の2つのループは、「i」のどの値に対して実行されますか?

4

4 に答える 4

48

i到達すると-1、の値は~i、、~-1または0になり、whileループの実行が停止します。演算子は、!まったく異なることを行うために機能します。その結果、100他のすべての値が得られます。~ビット単位の否定です。

もう少し詳しく:

  • ~数値の各ビットを取得して切り替えます。したがって、たとえば、100102011012になります。
  • -12の補数の符号付き整数の場合、はすべて2進数です。
  • ~0b…11111111です0

でも:

  • !0です1!anythingElseです0
  • -1ではありません0
  • !-1まだです0

また、実際にを含めてループしたい場合は、の代わりにをi == -1使用してください。while (i)while (~i)

于 2012-07-20T02:54:42.707 に答える
5

あなたは終了条件であることについて正しいですi == -1:あなたのループはと同等です

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

このように書くと-1、値が印刷されない理由が明確になります。値が最初に印刷され、次に増分されます。そのため-2、最後に印刷する値が表示されます。

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

于 2012-07-20T02:58:20.413 に答える
3

'〜'は、:〜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

于 2012-07-20T03:22:54.870 に答える
1

!真/偽のロジックフリッピングです

!を意味any nonzero becomes 0し、0 becomes 1

例1。!0b1010 -> 0b0000

例2。!0b0000 -> 0b0001

例3。!0b1111 -> 0b0000

一般化された、out = in?0:1

その間...

~ビットフリッピングです

~意味flip each and every bit

例1。~0b1010 -> 0b0101

例2。~0b0000 -> 0b1111

例3。~0b1111 -> 0b0000

一般化された、out = in^0b1111

于 2020-04-06T21:58:33.550 に答える