2016-09-20 6 views
-1

以下のforループを実行するよりエレガントな方法はありますか?ゼロをチェックしてからブレークするif文は醜いですが、私がそれを含めなければ、コードは無限ループになります。ゼロまでの右シフトのループで、ゼロを含める

for (int i = 8; i >= 0; i >>= 1) { 
    printf("%d", i); 
    if (i == 0) { 
     break; 
    } 
} 

理想的な出力は次のようになります

8 
4 
2 
1 
0 

Iループのため、任意のループ構造は、例えば、使用することができると述べたにもかかわらずまたは

+2

のようなループを書くことができる理由はない 'I = 8;行う { ...; i >> = 1; } while(i> 0) '? –

+3

皆さんはどちらも問題文を読んでいます。彼は後続のゼロ・ループを実行したい。 – Joshua

+1

@ジョシュア:私を教えてください。このUBはなぜですか? – Olaf

答えて

0

私ができる最善のはあるん-ながらながら:

for(int i = 8;;) { 
    printf("%d", i); 
    if (!i) break; 
    i >>= 1; 
} 

いくつかの(N + 0.5)条件節にパックすることができますループ。しかし、これはそれらの一つではありません。

+0

@ user3386109:また、私は無意味なループテスト(これは主な変更です)を削除しました。 – Joshua

+0

@ user3386109:私の答えは、その8が本当に変数であれば、それをすることができないということです。 – Joshua

2

以下のforループを実行するよりエレガントな方法がありますか?ゼロをチェックしてからブレークするif文は醜いですが、私がそれを含めなければ、コードは無限ループになります。

あなたはを行う場合、それはfor文でループ終了条件を提供するために、無意味だ、それを含めます。エレガンスは、見る人の目にはややかもしれないが、あなたのループ終了条件が常に満足されるので、私が代わりにこのようなループを書くかもしれません:

また
for (int i = 8; ; i >>= 1) { 
    printf("%d", i); 
    if (i == 0) { 
     break; 
    } 
} 

右シフトがあるように、あなたはそれを再構築できあなたは、可能性が

for (unsigned int i = 8 << 1; i;) { 
    i >>= 1; 
    printf("%u", i); 
} 
+0

私は、論理をforループに限定しておくためにいくつかのトリックがあることを望んでいますが、余分なif文が必要な場合はそれを保持することができます。 – Noah

+1

あなたの選択肢はもう少しよく見え始めています。 – Noah

+0

私はその2番目のループを書いていましたが、2^31の始まりのケースを考えた後に救済しました。 – Joshua

0

あなたは常に最後に「0」を印刷したい知っているので:終了テストの後に行うが、ループ本体の残りの部分の前に

for (int i = 8; i > 0; i >>= 1) { 
    printf("%d", i); 
} 
printf("0"); 

また、あなたが最初に**左可能性がシフト「」開始値は、その後の操作を行います。

for (int i = 8 << 1; i > 0;) { 
    i >>= 1; 
    printf("%d", i); 
} 

この方法の欠点は、あなたがビット幅を失うということです。開始値が大きい場合は、左シフトでオーバーフローが発生します。ここで

-1

は私のとてもシンプルですが1行のコードではありません。

#include <stdio.h> 

int main(void) { 
    int i = 32; 
    while(printf("%d\n", i), i >>= 1, !i ? printf("0\n"), 0 : 1); 
} 

私はそれが役に立てば幸い! :)

+0

私の実際のコードの "printf"はループ変数を使った実際の数行のコードなので、考慮してください。 – Noah

+0

@ Noahので、間に空白(改行など)を挿入してください! ':)' –

+0

すべての '\ n'文字を削除するだけで、C++文(またはプログラム)を1行にすることができます。 –

1

あなたの代わりにビットマスクのビット数で開始した場合、あなたはこの

for (int bit=3, mask=1<<bit; bit >= -1; bit--, mask >>= 1) { 
    printf("%d\n", mask); 
} 
関連する問題