2011-05-22 57 views
10

定義這種方式,我們既不能做++x++也不能做++x--。但在另一方面,無論(++x)++(++x)--是有用的表達式:(++x)++增量x由兩個並返回「中間」的值,而(++x)--實質上等同於x+1但完全避免了打電話operator+,這是非常有用的,有時。爲什麼postfix operator ++比前綴operator ++具有更高的優先級?

那麼爲什麼優先級沒有被定義爲++x++自動擴展到(++x)++而不是++(x++)?對於後者我有一些不明白的含義,還是僅僅將優先級保持爲一個簡單列表,並且所有前綴運算符構成一個單一級別?

編輯好的,我沒有明確說出來,但是:當然我的意思是x是用戶定義的類型。對於內置類型,(x+=2)-1當然好於(++x)++,而x+1lot好於(++x)--。我想到的情況是一個相當複雜類型的半關聯容器的迭代器,其中操作符+=+(專爲隨機訪問而設計)必須重建緩存以便爲一般請求高效工作,因此比++慢一個數量級。但是我當然可以修改它們,以便首先檢查參數是否是非常小的整數,在這種情況下,只需重複調用operator++而不是隨機訪問過程。這應該可以在這裏很好地工作,儘管我可以想象我可能在某種程度上有一種情況,我希望operator+=總是以隨機訪問的方式進行,而不管我呈現的數字有多少。


所以......我,我可以得出結論,答案是:

具有簡單和幸福memorizeable優先級表的優點,即任何來之前所有後綴運算符前綴運算符的足以容忍總是必須使用括號來組成前綴和後綴運算符的小缺陷,因爲該組合很少被使用。

更簡單的「C確實是這樣」,而這很可能是真正原因,是迄今爲止對我不太滿意,因爲自從++x++是不是在C它會在所有允許可以在不破壞現有代碼的情況下重新定義這種構圖。

無論如何,我會繼續使用(++x)--,因爲圓括號確實不會傷害太多。

+3

即使這些例子不是ub,由於混淆的餘地很大,所以很少有效用 – 2011-05-22 07:36:17

+0

都不是在C++中的UB 0x – 2011-05-22 07:42:11

+0

最初的C規範是否有任何關於這些運算符如何分組的說法? – 2011-05-22 09:47:20

回答

4

C++標準只是保留了C規則,顯然這些規則並沒有考慮到操作符重載和習語,但是仍然是以一種尚未被髮明的語言發明的。

看什麼是可用在D.M. Ritchie Home Page,就看到這個優先在B已經存在(元運算符綁定從右到左。因此-!x++勢必-(!(x++))用戶的參考到B),我沒在BCPL中看不到增量操作符。

1

Both (++x)++ and (++x)-- invoke undefined behaviour [假設x是原始類型]。對於用戶定義的類型場景would be different。但是,通常不推薦在您的代碼中使用這樣的混淆表達式

就優先權而言this answer解釋了爲什麼後增量優先於預增量。

+3

由於在問題中沒有指定'x'的類型,所以這些都不一定會產生未定義的行爲。 – 2011-05-22 07:35:16

+1

順便說一句,我從您發佈的鏈接中閱讀了Eric的帖子,並且沒有任何解釋。此外,該鏈接中的問題用「C#」標記。 C#與C++不同。我不明白Eric的帖子在這裏的相關性。 – Nawaz 2011-05-22 08:15:03

+0

@Nawaz:從C++的角度來看,他的理由也是合適的。 – 2011-05-22 08:18:48

6

(++x)++增量x由兩個並返回 「中間」

爲什麼不(x += 2) - 1(++x, x++)的價值?兩者似乎都更清晰。對於標量,這兩者在C++ 03中都有明確定義,與您提出的表達式相反。


(++x)--基本上等同於x+1但完全避免了必須調用operator+,它可以是相當有用有時。

這是一個任意說明,沒有任何解釋。所以,我要扔到池:

x+1基本上等同於(++x)--但完全避免了打電話operator++operator--這可能是有用的時候。


那麼,爲什麼沒有定義的優先級有++ X ++自動擴展到(++ x)的++而非++(X ++)

只是爲了讓這種奧術角落案件沒有出錯?沒門。你能爲我背誦man operator嗎?如果你不能這樣做,最好不要在代碼中寫入++x++

相關問題