2

最近、コードの品質を向上させるために -Wall コンパイラ スイッチを使い始めました。この小さなスニペットについて(正しく)警告を発しています...

    int i;

    for (i = start - 1; i >= 0; i--)
    {
        if (i >= number1.array.size())
        {
            one_value = 0;
        }

number1.array.size は署名されていないためです (これは std::vector の size メソッドです)。ループ内のテストは i >= 0 であるため、署名する必要があります。そうしないと機能しません。3 つの選択肢があるようです。-Wall の使用を控える、警告を無視する、または補助的な要素を導入する...

    int          i;
    unsigned int j;

    for (i = start - 1; i >= 0; i--)
    {
        j = i;

        if (j >= number1.array.size())
        {
            one_value = 0;
        }

これらのどれも特に望ましいとは思えません。この場合、私が何をすべきかについて、代替案を提案したり、推奨したりできますか?

4

5 に答える 5

3

「ループ内のテストは i >= 0 であるため、署名する必要があります。そうしないと機能しません。」次のようにテストを変更するだけです。

for(unsigned i = start; i--;) {
    // ...
}

ループ本体で i と同じ値を返します。

于 2010-08-13T10:19:52.280 に答える
2

サイズ関連の比較には「size_t」を使用します。

size_t i = 0;
于 2010-08-13T10:20:40.700 に答える
1

まず、符号付き数値を符号なし型に割り当てると、非常に深刻な結果を招く可能性があります(符号付き32ビット型の-1は、符号なしの4 294 967 295です)。これが、警告が存在する理由の1つです。両方のソリューションでどちらかの場所で変換を行い、どちらを使用しても、size()を符号付き整数にキャストするだけで同じ効果が得られます。

これらの線に沿った何かが脆弱性を排除します(正確性がチェックされていません)

for(unsigned int i=0;i<start;i++)
{
if(start-i>number1.array.size()) one_value=0;
}

おもう :)

于 2010-08-13T10:28:54.033 に答える
0

あなたは試すことができます:

unsigned int i;

for (i = start; i > 0; )
{

    if (--i >= number1.array.size())
    {
        one_value = 0;
    }

}
于 2010-08-13T10:21:33.070 に答える
-1

これはコードと同じように動作するはずです -から( ではなく)から
i実行され、それに応じて配列サイズのテストが変更されました。start1start-10

unsigned int i;

for (i = start; i > 0; i--)
{
    if (i > number1.array.size())
    {
        one_value = 0;
    }
于 2010-08-13T10:09:18.677 に答える