的順序我從書ķ&ř一個優先的實例爲:優先功能和評估K&R
x = f() + g();
f可以克之前或進行評估反之亦然
我所知道的是,paraentheses的評價()
我的訂單比+
高,之後是=
。除了()
評估的順序將從從左至右。所以,如果我是正確的,他爲什麼說可以被評估,就好像它是並不一定?
這個問題有點愚蠢,但對我來說很清楚不清楚。
的順序我從書ķ&ř一個優先的實例爲:優先功能和評估K&R
x = f() + g();
f可以克之前或進行評估反之亦然
我所知道的是,paraentheses的評價()
我的訂單比+
高,之後是=
。除了()
評估的順序將從從左至右。所以,如果我是正確的,他爲什麼說可以被評估,就好像它是並不一定?
這個問題有點愚蠢,但對我來說很清楚不清楚。
這意味着它是由C編譯器實現的,是否先在右側評估+
的左側,反之亦然,然後再將+
運算符應用於這些結果。如果f()
和g()
執行所謂的副作用,這一點很重要。如果f()
修改某些全局變量,並g()
修改同一個全局變量,通過f()
進行的修改將如果C編譯器計算爲準從右到左,而如果編譯器計算從左向右g()
進行修改爲準。
值得注意的是,編譯器不必每次遇到同樣的表達方式;它可能會根據周圍環境選擇不同的代碼。同一個編譯器的新運行,或編譯器的新版本,或不同的編譯器 - 所有這些都可能會給出不同的結果。雖然大多數編譯器實際上都是確定性的,但他們沒有義務遵循「似乎」規則。 –
令人困惑的是標準說+
是從左到右的關聯,但這並不意味着總和的每個子表達式都是從左到右進行評估!未指定子表達式的評估順序。因此,如果您有:
f() + g() + h()
那麼編譯器就可以產生類似:
t1 = h()
t2 = f()
t3 = g()
(t2+t3)+t1
這對於像i++ + ++i
表達式很多程序員不能對同樣的問題。
有F的'沒有序列點()'和'克()',它喜歡這樣編譯器可以做什麼。作爲一般規則,C中的表達式不是從左到右評估的。 – sapi
也參見[在C99,是'F()+ G()'未定義或僅非特定?](http://stackoverflow.com/questions/3951017/in-c99-is-fg-undefined-or-merely-未指定的/ 3951189#3951189) –
對於二元運算符,在優先級的表中的「從左到右」註釋意味着'A - b - C'具有被解釋爲'(一 - b) - C',而不是作爲'a - (b - c)'。這也意味着'a + b - c'被解釋爲'(a + b) - c'而不是'a +(b - c)'。然而,這並不能阻止在'a'或'b'之前評估'c';操作數的評估順序仍然取決於編譯器。 –