0
#include<iostream.h>
void main()
{
   int x[]={1,2,3,4,5};
   for(int i=0;~i<5;i++)
      {    cout<<*x;
      }
}

このプログラムを実行すると、コンソールの表示に無限の 1 が表示されます。これがどのように発生したのか理解できませんでした。このプログラムから抜け出すために親切に助けてください... それはチルダ演算子によるものですか?

4

4 に答える 4

7

はい、ビットごとの NOT 演算子( ~)と未定義の動作の組み合わせが原因です。

基本的に、より大きな値に対して負の数を返すため、~i常に50あなたの場合よりも)低くなります。最大数に達すると、オーバーフローし、未定義の動作が発生します。i0inti++

ただし、それまでは、それが返さ1れるため、印刷したことになり*xます。

于 2012-10-31T15:20:39.127 に答える
0

演算子は~BITWISENOTブール演算子です。したがって、カウンタはanint32であり、ビット単位のNOTの結果は常に負の数になるため、ループは無限大になります。

于 2012-10-31T15:23:32.497 に答える
0

チルダはビットごとの逆演算子です。したがって、~0x00000000=0xFFFFFFFF または -1 です。i を増やすと、これは非常に長い時間、数十億回の反復で実行されます。

于 2012-10-31T15:20:43.563 に答える
0

~ 演算子はビットごとの NOT です。int の符号付きの性質により、ビットごとの NOT は数値を負にし、これは 5 未満です。あなたがやろうとしていることのためにそれを取り除いてください。

于 2012-10-31T15:21:06.693 に答える