#include<iostream.h>
void main()
{
int x[]={1,2,3,4,5};
for(int i=0;~i<5;i++)
{ cout<<*x;
}
}
このプログラムを実行すると、コンソールの表示に無限の 1 が表示されます。これがどのように発生したのか理解できませんでした。このプログラムから抜け出すために親切に助けてください... それはチルダ演算子によるものですか?
はい、ビットごとの NOT 演算子( ~
)と未定義の動作の組み合わせが原因です。
基本的に、より大きな値に対して負の数を返すため、~i
常に5
(0
あなたの場合よりも)低くなります。最大数に達すると、オーバーフローし、未定義の動作が発生します。i
0
int
i++
ただし、それまでは、それが返さ1
れるため、印刷したことになり*x
ます。
演算子は~
BITWISENOTブール演算子です。したがって、カウンタはanint32
であり、ビット単位のNOTの結果は常に負の数になるため、ループは無限大になります。
チルダはビットごとの逆演算子です。したがって、~0x00000000=0xFFFFFFFF または -1 です。i を増やすと、これは非常に長い時間、数十億回の反復で実行されます。
~ 演算子はビットごとの NOT です。int の符号付きの性質により、ビットごとの NOT は数値を負にし、これは 5 未満です。あなたがやろうとしていることのためにそれを取り除いてください。