2013-07-24 31 views
-1
double *p; 

顯然,gcc 4.6.3只會在-O3的下一行中將p加1。C編譯器中錯誤的通用表達式替換?

myfunc (*(p++), *(p++)); 

這是一個錯誤?

+0

您可能想要搜索術語「序列點」。這是一個關於增量運算符的常見問題,我認爲如果您搜索該網站,您可以找到一些非常好的答案。 – templatetypedef

+2

每行代碼的一項操作就是要走的路 - 您可以使代碼更易於閱讀,而且不會遇到這類問題。 –

+0

@EdHeal +1對於'每行代碼的一個操作是要走的路線' –

回答

1

*(p++)不增加指針指向的值。

如果你想增加值你會做(*p)++;

另一件事是,您不能保證評估參數的順序。這取決於編譯器。所以左側可以先遞增,然後遞增。無論哪一個參數將以原始值發送,接下來將是原始值+ 1(由於後增量的性質); 在函數之外,如果您沒有在其中修改* p,那麼* p應該已經增加了兩次。

1

如果增量運算符修改same sequence point (statement)中的same variable,則會導致未定義的行爲。 例如,如果你調用一個函數是這樣的:

foo(++i, ++i) 

C標準不說,其中責令增量應該進行,你不能預測什麼會被傳遞給函數。 它與您的功能相同的情況。

myfunc (*(p++), *(p++))

其中一方可以先評估。