1

size_t で動作する同等のバージョンを作成しようとしている通常の符号付き整数に対して正常に動作するこのコードがあります (現在、start と count は int であり、size_t である必要があります) :

int count,start;
for (start = (count-2)/2; start >=0; start--)
{
     someFunction( x, start, count); // x is to illustrate function has other parameters
}

このコードは本当に単純な解決策としては十分に単純だと思いますが、私は空白を描いています。

4

4 に答える 4

3

次のように書き換えることができます。

start = count/2;
while (start > 0){
    start--;
    someFunction( x, start, count);
}

~(size_t)0それ以外の場合、私が考えることができる唯一の他のオプションは、署名付きと署名なしの間で非標準準拠のキャストを行うことです...または...で何かをすることです

以下に、標準に準拠していない代替手段をいくつか示します。

for (start = (count-2)/2; (ssize_t)start >= 0; start--)
{
     someFunction( x, start, count);
}

for (start = (count-2)/2; start != ~(size_t)0; start--)
{
     someFunction( x, start, count);
}
于 2011-12-09T04:28:40.350 に答える
1
size_t cnt, start;
for (start = cnt/2; start-- > 0; ) { ... }
  • cnt = 0の場合:startはゼロから開始し、ループコードは実行されません。ループの後、開始は(size_t)-1になります
  • cnt = 1の場合:同じ
  • cnt> = 2の場合:ループコードは少なくとも1回実行されます。最初の反復では、開始は(cnt / 2)-1になります。最後の反復の開始は0になります。ループ開始後は(size_t)-1になります

OPが本当にcnt=1に対して1回ループしたい場合は、3項が必要です。

for (start = (cnt==1) ? 1 : cnt/2; start-- > 0; ) { ... }
于 2011-12-09T10:33:55.163 に答える
0

元のコードから終了条件を修正できます。-1/2C99 では 0 であることが保証されているため、ループ本体が 1 回実行されるためcount == 1、型が署名されていない場合でもそれが必要な動作である場合は、特別に処理する必要がある場合があります。

size_t count = something;
if (count > 1) {
    for (size_t start = (count-2)/2; start != SIZE_MAX; --start) {
        someFunction(x, start, count);
    }
}

startこれが機能するのは、 の初期値が ではあり得ないことがわかっているためです。これは、2 で割ったときにSIZE_MAXの値が得られないためです。size_tSIZE_MAX

より一般的なループでは、 で開始しSIZE_MAXて 0 までずっと下に行く必要があるかもしれませんが、明らかにループ本体の前に終了チェックを実行することはできませんsize_t。終了できる値はありません。その場合を許可するには:

size_t count = SIZE_MAX, start = SIZE_MAX;
do {
    someFunction(x, start, count);
} while (start-- != 0);

すべての場合において、SIZE_MAXを に置き換えることができます。これは、すべての符号なし型の最大値に変換されるという点でより一般的ですが、混乱した質問-1につながります。

于 2011-12-09T10:19:34.573 に答える
0

値を 1 つずらすだけではどうでしょうか。

size_t start_plus_one;
for (start_plus_one = (count-2)/2+1; start_plus_one >=1; start_plus_one--)
{
     someFunction( x, start_plus_one-1, count); // x is to illustrate function has other parameters
}
于 2011-12-09T05:35:50.500 に答える