2015-10-16 59 views
0

我想知道是否有人可以解釋增量運算符++和使用...=... + 1之間的差異。我寫了下面一小段代碼在10檔分類編號:當解引用迭代器時,x ++和x = x + 1之間的C++差異

#include <iostream> 
#include <string> 
#include <vector> 

using std::cout; 
using std::endl; 
using std::string; 
using std::vector; 
using std::cin; 

int main() 
{ 
    vector<unsigned> vec(11,0); 
    unsigned num; 

    while(cin >> num){ 
     if(num < 100) 
      *(vec.begin() + num/10) = *(vec.begin() + num/10) + 1; 
     else ; 
    } 

    for(vector<unsigned>::iterator it = vec.begin(); it != vec.end(); it++) 
     cout << *it << endl; 
    return 0; 
} 

當我更改此代碼的以下部分:

*(vec.begin() + num/10) = *(vec.begin() + num/10) + 1; 

到:

*(vec.begin() + num/10)++; 

的代碼不再工作。即每個箱中的數字量保持爲0.

有人能解釋我這兩行代碼之間的區別嗎?這是由於操作的順序嗎?也許它先增加然後解除引用?但如果是這樣,我不明白爲什麼。

BTW:我在C + + 98模式下使用最新版本的G ++

+1

你試過'(*(vec.begin()+ num/10))++;'? – Petr

+1

[運算符優先級](http://en.cppreference.com/w/cpp/language/operator_precedence) – 101010

+0

另外preincrement總是更好,如果你不需要舊值 – KIIV

回答

4

++*更高的優先級,讓你的表達被解析如下:

*((vec.begin() + num/10)++); //increment, then dereference 

你需要明確訂購:

(*(vec.begin() + num/10))++; 

請注意,預增不需要副本,所以通常情況下,如果您不需要副本訪問前值:

++(*(vec.begin() + num/10)); 

這就是說,該行非常嘈雜和不明確的,我會分裂的表達,如果我是你:

if(num < 100){ 
    auto position = vec.begin() + num/10; 
    ++(*position); 
} 

甚至更​​好(由@dascandy建議) :

if (num < 100) { 
    ++vec[num/10]; 
} 
+0

謝謝!這幫助了很多。 –

+0

我會將最終結果更改爲'auto&count = vec [num/10];計數++;';這也消除了在線後需要解引用。 – dascandy

+0

@dascandy這是一個非常好的建議,謝謝。 – TartanLlama

相關問題