3

この(C++またはおそらくC)コードがあるとします:

vector<int> my_vector;
for (int i = 0; i < my_vector.size(); i++) {
    my_vector[i] = 0;
}

それが正しく行われたかどうかは気にしません。重要な部分は for ループの宣言にあります。size() は符号付きではなく符号なし int を返すため、コンパイラはこれに対して符号付き/符号なしの不一致を示します。iunsignedに変更することの重要性 習慣からループ カウンターを int として宣言しますが、これが潜在的なエラーである場合は、習慣から抜け出すように強制します。

4

6 に答える 6

13

技術的にiは、vector<int>::size_type. typedefコードで sを使用する習慣を身に付ける必要があります。

typedef vector<int> VectorType;
VectorType my_vector;
for (VectorType::size_type i = 0; i < my_vector.size(); i++) {
    my_vector[i] = 0;
}

これを a に変更すると、deque1 行だけが変更されます。風変わりな size_type を持つカスタム コンテナーであっても、すべてがうまくいくという、暖かくあいまいな感覚が得られます。そして、それは非常に価値があります。unsigned/signed だけであっても、signed/unsigned 変換を使用すると、必然的に戻ってくる厄介なプロモーションの問題がいくつかあります。

于 2009-06-29T19:41:15.117 に答える
10

これは非常に重要なことです。警告をエラーとしてコンパイルし、すべての警告を修正するように努力する必要があります。このような問題をコードに残しておくと、警告を無視したり、このような誤検知によって実際の問題を示す警告が無視されたりする癖がつきやすくなります。

この場合、この特定のエラーについては、おそらく大したことではありません。32 ビット プラットフォームでは、符号なしが負の符号付きの値に折り返される前に、ベクトルに 20 億を超えるエントリが必要です。このようなベクトルを取得すると、すべてのメモリが使い果たされるため、符号付き/符号なしの不一致が問題になるような状態になることはおそらくありません。

于 2009-06-29T19:42:17.177 に答える
6

これは、ベクターのサイズが を超えた場合に重要になる場合がありますINT_MAX。ベクトルのサイズが signed で表現できる最大値より大きい場合、intループは決して終了しません。

于 2009-06-29T19:41:41.030 に答える
1

符号付き整数には符号があるため、それは重要です。負の値になる可能性があります。その場合、それがどれほど大きくても、符号がない size() よりも小さくなります。

11111111 < 10000000

于 2009-06-29T19:41:51.530 に答える
0

あなたの例のほとんどの場合、それは問題ではありません。しかし、プログラムが機能しない場合、最初に行う (またはすべき) ことは、警告がないことを確認することです。

警告ができるだけ少なくなるようにします。

于 2009-06-29T19:44:21.617 に答える
0

上記のように、 vector::size_type; を使用してください。または、イテレータを使用してベクトルをループします。独自の警告はすべてエラーとして処理してください。

于 2009-06-29T20:33:42.750 に答える