2011-09-11 4 views
0

のループのために、私は、変数x = 1のC.でループの初期値に値を合計しようとしていますし、私はそれを設定された回数を倍増し、結果を追加します。私はforループを作ったが、私の合計は初期値で常にオフになっています。誤った合計 - C

x = 1例えば、もし、パターンが行く必要があります。

1, 2, 4, 8, 16 

を...とtotal31でなければなりません。残念ながらtotalは1つずれています。

int x = 1; 
int y = 10; 
int total; 

for(int i = 1; i < y; i++) 
{ 
    x *= 2; 
    total += x; 
} 

printf("Total: %d\n", total); 

これは1つではありません。ループを2ではなく1で開始するにはどうすればよいですか?

+0

これは、最初の値x = 1が合計に加算されないためです。最初に 'total + = x'に達すると、xの値はすでに2になっています。 – arunkumar

+0

forループを削除し、' total =(2 << y)-1;あなたが望む出力を正確に伝えるのは難しいです)。 –

+0

この宿題はありますか?もしそうなら、私たちが対応する方法を知っているようにタグを付けてください。 –

答えて

2

forループの本体にある2つのステートメントを切り替えます。また、これをすべて関数に移動したい場合は、totalを0に初期化することをお勧めします。

+3

私は、OPが関数にそれを移動したいかどうかにかかわらず、 'total'を0に初期化することをお勧めします。 – AnT

+0

あなたは正しい@Andrey +1です。グローバルintはゼロに初期化されていますが、これに頼るのは悪い習慣です。それを読むことは難しく、初期化は実際にはよく知られていません。 –

+0

はい、しかし、私はグローバルな「合計」の兆候は見られません。さらに、私の答えで述べたように、私はOPの意図が異なっており、 'total'を初期化する適切な値は' 0'ではなく '1'であると信じています。 (つまり、サイクルを変更する必要はありませんでした)。もし私が正しいのであれば、元のものがなぜうまくいかなかったのかを本当に理解することなく、あなたのアプローチに従ったOPが恐れられます。 – AnT

0

通常、誤ったコードの場合と同様に、それを「修正」する方法があります。 については十分に明確にしましたが、実装しようとしているのはです。あなたはそれを実装しようとしています。

  • @Ray TOALはすでに彼の答えで述べたように、正しい結果がサイクルの前に0totalを初期化し、サイクル内部の添加後x *= 2を行うことによって得ることができます。

  • また、元のコードのようにサイクルが正常であると言うこともできます。サイクル前にtotal1を初期化するだけで済みます。

どちらの方法が元々実装しようとしていた方法に近いですか。知っているだけです。どちらの場合も、正しい回数の反復を作成してください。