2017-01-13 7 views
0
int i=1,j=0,n=10,k; 
do{ 
    j+=i; 
    i<<1; 
    printf("%d\n",i); 
    // printf("%d\n",12<<1); 
}while(i<=n); 
printf("%d\n",j); 

を有するシフト演算子作品(12 < < 1 = 24)が、i<<1は0.JはI 0とNループ意志を変更continuously.Ifが増加しているままで行いますそれは正常ですが、iのインクリメントは決して起こりません。と右シフト、whileループにおいて効果なし

いずれの方向にもシフトできても動作しません。

+2

Typo 'i << 1'は' i << = 1'でなければなりません。コンパイラの警告を有効にしてください:警告が表示されます。たとえば、MSVCからの警告は*警告C4552です: '<<':演算子は効果がありません。副作用のある予想されるオペレータ* –

+0

@WeatherVaneありがとう、私は将来の警告を見ていきます! –

答えて

0

i << 1は、iの値には影響しません。注

i <<= 1; 
i = i * 2; 
i *= 2; 

:のみi >= 0もしあなたが探しすることができることは

i = i << 1; 

または多分同じことを行うには、次の1です。

+0

解決に感謝します! –

+1

注: 'int i'と' i <0'(OPのコードではありません)では、 'i * = 2'はオーバーフローしたときのUBだけです。 'i << = 1;'は常にUBです。常に同じではない。 – chux

1

<<オペレーターがその場で作業していません。結果をどこかに割り当てる必要があります。例えば:上記と同じである

i = i << 1; 

又は

i <<= 1; 

+0

解決策はありがとうございますが、私はあなたの答えをもう一度得て、もう1つはもっと速く答えてくれました。私は正しい答えのために彼を選ぶ必要があります:( –

+0

これは大丈夫です。時間:) –

関連する問題