2017-02-04 15 views
-6

なぜこの結果は無限ループになりますか?これはなぜ無限ループに入りますか?

forループを入力した後、私はiv.size()-2の値を印刷し、それらはそれぞれ0-1あります。したがって、ループ条件はfalseでなければなりません。次に、このプログラムはまず最初にforループに入りますか?

#include <iostream> 
#include <vector> 

int main() { 
    std::vector<int> v {1}; 
    std::cout << "Size:: " << v.size(); 
    for (int i=0 ; i <= (v.size()-2) ; i++) { 
     std::cout << "Hello"; 
    } 
    return 0; 
} 
+2

正確にあなたがどこにいるか " - 2()v.sizeの値を印刷":追加で減算を置き換え、このような状況を避けるために

? –

+0

あなたのプログラムは、 'i ++'が符号付き整数オーバーフローを引き起こすため、おそらく未定義の動作をしています。 –

+7

あなたのコンパイラは、署名付きの符号なし比較について警告していたはずです。それができない場合は、警告をどのようにして増やすかを見つけてください。 – molbdnilo

答えて

8

問題は、アンダーフロー後の符号なし数値と比較しています。

ベクトルのサイズは1です。subtracrは2、-1は数学的に得られます。しかし、符号なしの数学では、数が非常に多くなるため、ループは予想よりも長く続きます。

i+2 <= v.size() 
+0

符号なし整数に負の数が割り当てられている場合の詳細はこちら:http://stackoverflow.com/questions/2711522/what-happens-if-i-assign-a-negative-value-to-an-unsigned -変数 –

関連する問題