2012-04-13 35 views
0

我幾乎從來沒有把++或 - 放在任何地方,除了它自己的路線。我知道他們可能會導致未定義的行爲,並可能是地獄調試。但爲了冗長的目的,我很想動。這是有效的代碼嗎?在賦值有效的C++的右側使用了一個predecrement運算符?

map<int, int> dict; 

... 

int key = ...; 
if (dict.lower_bound(key) != dict.begin()) { 
    int prevval = (--dict.lower_bound(key))->second; 
    ... 
} 

我倒是喜歡只是做

int prevval = (dict.lower_bound(key)-1)->second; 

operator-()定義雙向迭代器不具備的。

謝謝!

+0

如果您不確定操作順序 - 使用更多括號 – Ulterior 2012-04-13 17:58:33

回答

2

是的,它是完全有效的,並按預期工作。

使用這些操作符時未定義的行爲通常來自序列點之間多次修改變量,這不是您的情況。

1

其實你正在做一個初始化而不是任務,但是這並沒有改變任何東西。

但是,您的代碼是有效的,因爲在應用所有操作符的順序中沒有選擇。如果表達式可以在可以按任意順序評估的子表達式中分割,則必須小心。