7

無限ループに入ることなく、これに似たものを実行するエレガントな方法は何iですかunsigned char

for (unsigned char i = 0; i < 256; ++i) {
    printf("%d\n", i); 
}   
4

3 に答える 3

18
unsigned char i = 0;
do {
    printf("%u\n",i);
}while(++i != 0);

ループテストで増分を実行し、ラップされた値に対してテストします。

于 2012-10-30T13:06:08.193 に答える
3

一般的な経験則として、イテレータ変数が0から「Uxxx_MAX」までのすべての値を保持する必要がある場合は、アルゴリズムに対して狭すぎるタイプを選択しました。

uint16_t代わりに使用することを検討する必要があります。

unsignedcharの代わりに大きなint型を使用できない場合が非常に多くあります。では、アプリケーションは8ビットMCU用に作成されたリアルタイム組み込みシステムですか?このループがパフォーマンスのボトルネックであることがわかりましたか?

  • はいの場合は、イテレータのタイプとしてあいまいなループを記述し、それuint8_tを行った理由をコメントします。
  • いいえの場合は、uint16_tまたはそれより大きい整数型を使用します。
于 2012-10-30T14:16:35.810 に答える
1

本体の後、増分の前にチェックを入れてください

for (unsigned char i = 0; ; ++i) {
    printf("%d\n", i); 
    if(i==255)
        break;
}   

しかし、それならしばらくしてください。

unsigned char i = 0;
while( ) {
    printf("%d\n", i); 
    if(i==255)
        break;
    ++i;
}   

または、チェックを押してください:

for (unsigned char i = 0; i++ < 255; ) {
    printf("%d\n", i); 
}   

これらはすべて、後でゼロをチェックするのではなく、増分の前に255をチェックします。したがって、変数がCHARまたは現在256に制限されているが変更可能なマクロである場合、オーバーフローに依存しないため、これらは引き続き機能します。 。そこで代用intしても、それでも機能します。

于 2012-10-30T13:53:06.127 に答える