2015-01-02 105 views
1

的順序我從書ķ&ř一個優先的實例爲:優先功能和評估K&R

x = f() + g();

f可以克之前或進行評估反之亦然

我所知道的是,paraentheses的評價()我的訂單比+高,之後是=。除了()評估的順序將從從左至右。所以,如果我是正確的,他爲什麼說可以被評估,就好像它是並不一定

這個問題有點愚蠢,但對我來說很清楚不清楚。

+1

有F的'沒有序列點()'和'克()',它喜歡這樣編譯器可以做什麼。作爲一般規則,C中的表達式不是從左到右評估的。 – sapi

+2

也參見[在C99,是'F()+ G()'未定義或僅非特定?](http://stackoverflow.com/questions/3951017/in-c99-is-fg-undefined-or-merely-未指定的/ 3951189#3951189) –

+2

對於二元運算符,在優先級的表中的「從左到右」註釋意味着'A - b - C'具有被解釋爲'(一 - b) - C',而不是作爲'a - (b - c)'。這也意味着'a + b - c'被解釋爲'(a + b) - c'而不是'a +(b - c)'。然而,這並不能阻止在'a'或'b'之前評估'c';操作數的評估順序仍然取決於編譯器。 –

回答

4

這意味着它是由C編譯器實現的,是否先在右側評估+的左側,反之亦然,然後再將+運算符應用於這些結果。如果f()g()執行所謂的副作用,這一點很重要。如果f()修改某些全局變量,並g()修改同一個全局變量,通過f()進行的修改將如果C編譯器計算爲準從右到左,而如果編譯器計算從左向右g()進行修改爲準。

+2

值得注意的是,編譯器不必每次遇到同樣的表達方式;它可能會根據周圍環境選擇不同的代碼。同一個編譯器的新運行,或編譯器的新版本,或不同的編譯器 - 所有這些都可能會給出不同的結果。雖然大多數編譯器實際上都是確定性的,但他們沒有義務遵循「似乎」規則。 –

0

令人困惑的是標準說+是從左到右的關聯,但這並不意味着總和的每個子表達式都是從左到右進行評估!未指定子表達式的評估順序。因此,如果您有:

f() + g() + h() 

那麼編譯器就可以產生類似:

t1 = h() 
t2 = f() 
t3 = g() 
(t2+t3)+t1 

這對於像i++ + ++i表達式很多程序員不能對同樣的問題。