C語言之優先級與運算順序

1、操作符的優先級


2、Order of Evaluation運算順序
    和其他語言一樣,C語言也沒有明確一個操作符的操作數們的計算順序(除了&&,||,?:和,),例如在表達式:
x = f() + g()
    f()和g()的運算順序並沒有明確規定,f()可能在g()之前運算,也可能在之後。因此,如果f()或者g()改變了另一個表達式也會用到的一個變量,那麼,x的值會依賴於表達式的運算順序,中間結果會存放在臨時變量中,最終導致了一個特殊的順序。

    printf("%d %d\n", ++n, power(2, n));
    這個表達式的結果會根據不同的編譯器產生不同的值,因爲++n和power(2, n)並不確定那個表達式先計算,爲了解決這個問題,可以採用以下方法:
    ++n;
    print("%d %d\n", n, power(2, n));

    函數調用、嵌入式賦值聲明和自加自減操作符都會產生副作用----一些變量被表達式運算結果的衍生物改變,在引入副作用的表達式中,就會產生依靠運算順序的結果,例如:
    a[i] = i++;
    這種情況下,編譯器會產生中斷,並根據中斷產生運算結果,根據不同的編譯器,產生的中斷不同,所以運算的結果也會不同。而標準協議故意把這些不明確的情況遺留下來。當表達式中的副作用產生時會把判斷力交給編譯器,因爲最好的運算順序非常依賴計算機的結構。雖然標準明確了所有參數的副作用在函數調用前發生作用,但是對於printf沒有什麼幫助。
    教訓:在任何一個語言中,寫出一個依賴運算順序的程序是非常糟糕的。自然地,你需要了解什麼是可以避免的,如果你不知道在各種機器上它們是怎麼做的,你就不會嘗試去利用一些特殊的執行操作。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章