一,問題的來源
在使用stl的時候,經常要遍歷容器。遍歷容器有幾種方法,一種就是使用下標遍歷。
在使用下標遍歷的時候,經常要用到一個遍歷的循環變量,往往這個變量一順手就寫成了:
1: int i = 0;
這個i在一般的情況下是沒有問題的,然後最近突發奇想,想像python那樣,能夠支持負的下標。
比如v是一個vector,v[-2]表示後兩個元素。
二,問題的描述
假設有這麼一段簡單的程序:
1: vector<int> numbers;//聲明一個vector;
2: numbers.push_back(1);
3: numbers.push_back(2);//壓入兩個數,讓他的size不爲0
4:
5: int numIndex =-2;//聲明一個有符號的整數
6: if(numIndex<numbers.size()){//-2跟2比較
7: cout<<"true"<<endl;
8: }else{
9: cout<<"false"<<endl;
10: }
-2跟2比較輸出的是 false,也就是-2要大於2.
這個是怎麼一回事呢。
三,問題的原因
其實上一段程序編譯的時候會有一個常見的編譯器warning:
“warning C4018: “<”: 有符號/無符號不匹配”,通常warning我們也不太在意,但是指不定
什麼時候,就耗掉你幾個小時。
這個waring就是說,在比較的時候,兩邊的符號不一致。
在式子:numIndex<numbers.size() 中
numIndex是有符號的,numbers.size()是無符號的。在有符號整數和無符號整數比較的時候,
有符號的整數會向無符號整數轉換,這個就是原因。
四,問題的思考
那有符號的numIndex轉換成無符號的的整數到底是多少呢?
1: unsigned int unumIndex = numIndex;//轉換
2: cout<<"unsigned value of -2:"<<unumIndex<<endl;
其結果是
-2:4294967294
也就是說-2轉換成了4294967294,這個數當然比2要大。
那爲什麼是這個數呢?
因爲C++中,int的大小是4個字節,也就是32位。2^32-2也就是這個數。
更多系列文章敬請訪問:我的個人博客 第九兔