2016-05-11 8 views
0

私は私のコードで奇妙なバグがあります:ouputを「私はこのポイントに到達することができますどのように来る?」となりますこのforループの条件はどうやって満たされますか?

vector<int> myVect; 
for(int i =0; i< myVect.size() -1; i++) 
{ 
    cout<< "how come I can reach this point?" << endl; 
} 

まだ分かりません。 MyVect.size()は、このベクトルが空であるため0です。 forループの条件がまだ満たされているのはなぜですか?

はあなた

+3

https://en.wikipedia.org/wiki/Integer_overflow – Drop

+1

試してみてください'i + 1 PiotrNycz

+9

'myVect.size() - 1'を印刷してみてください。 –

答えて

6

myVect.size()は、符号なし整数を返しますありがとうございました。ベクトルは空であるため、0になります。1を減算すると、std::vector::size_type(一般的にはstd::size_t)が保持できる最大値になります。

0であるiは条件を満たし、forループを入力するよりも小さいためです。

C++で始まる11 ranged based for loopsが導入されました。あなたは、コンテナをループにしたいし、その値を使用している場合は、その後の要素を変更する必要がある場合は、これは保証あなたが

for (auto & e : container_name) 
    // use e here however you want. 

使用することができます

for (const auto & e : container_name) 
    // use e here in a read only manner. 

を使用することができる、あなたのすべての要素をループ一般的にエラーが起こりにくい。

3

返される型veccot :: size()はsize_tです。これは符号なしの型です。 0(符号なし)から減算すると、数値はsize_tの可能な最大値に戻って折り返されます。

1

すでにあなたは符号なしの0から1を引く理由は、あなたの問題を解決するソリューションがに条件を変更することがあると答えている:

for(int i =0; i + 1 < myVect.size(); i++) 
+0

なぜ私は1で 'i'を起動しないのですか? – NathanOliver

+0

配列インデックスとしてループ内で 'i'を使うことができ、1から始めるとそのコードを検証/変更する必要があるためです。 – Slava

+0

ああ、そうです。考慮すべきことがあります。 – NathanOliver

関連する問題