2017-10-16 85 views
0

C課程的實踐測試複習問題。C具有操作員關聯性和優先級的功能評估順序

int c = f1(2,3) * f2(3,4) + f3(4,5); 

函數評估的順序是什麼?答案依賴於編譯器。 我的問題:爲什麼不使用*,+運算符的左到右關聯性和優先級?我將它改爲f1()+ f2()* f3(),並在每個函數中放置puts(「f1 now」)命令以進行快速測試。結果是順序f1,f2,f3,因此顯然不使用操作員關聯性和優先級對函數的評價順序我在思考3個函數設置/操作3個全局變量的後果,所以評價順序會很重要。

以外,不要寫這樣的代碼這是一個練習複習問題),我很困惑爲什麼運算符的優先級/關聯性並不決定函數賦值的順序,在此先感謝

+0

答案:專業工程師不關心,因爲他們放在明確的括號,使代碼的操作清晰,或因爲他們根本沒有使用這樣的表達式,因爲臨時變量和兩行使東西更容易進行調試。 –

+1

只有在訂單無關緊要時才能編寫這樣的代碼。你可以寫'y = sin(x)+ cos(x);'但是不會做'y = create_file(x)+ write_data(x)+ close_file(x);'。這只是沒有意義。 –

+0

@MartinJames但放入額外的括號並不會改變評估順序,對吧?這似乎是這個被標記爲重複的線程的整個點。 (除此之外,我將成爲那些說我頑固地拒絕加入括號的人,因爲避免它們可以確保我知道優先級/關聯性規則。*等待大量西紅柿*) –

回答

4

運算符優先級和關聯性並不決定評估順序,編譯器在哪裏添加括號。優先級意思是f() + g() * h() i s解析爲f() + (g() * h())。結合性意味着f() + g() + h()被解析爲(f() + g()) + h()。但是在所有這些情況下(即使明確給出了括號),函數可以按任何順序調用。