語句執行的順序

根據流程 (flow) 的定義,C 將按照指令出現的順序來執行, 除非出現了控制流程的語句,例如

while, for, if, else
所以,C 的指令執行順序是確定的。

但是,在一個指令當中,卻未必有固定的語句執行順序。 當出現逗點指令的時候,執行的順序確定是從左到右。 當逗點只是分隔函數的參數,或是分隔宣告的變數, 那就未必按照一定的順序執行。 例如,在我的機器上測試


#include <stdio.h>
main() {
    double x=2;
    printf("%f  %f \n", x, ++x);
}

得到輸出
3.000000  3.000000 
但是,若改成以下程式,
#include <stdio.h>
main() {
    int x=2;
    printf("%d  %d \n", x, ++x);
}

得到輸出
2  3
顯然,我的 gcc 編譯器有時候決定要先做 ++x,有時候不。 在不同機器、不同編譯器之下做實驗,未必得到同樣結果。

類似的情形還發生在任何二元運算符號之兩邊。 比如說 A+B,如果 AB 分別是一個語句, C 未必先執行 A 還是先執行 B。 例如說

    int n=1, m;
    m = (3*n) + (++n);
所得的結果,m 可能是 5,也可能是 8。 這不要和優先序與左右傾的觀念混淆了。 例如 + 是左傾的,所以 A+B+C 必然先執行 A+B, 得到的結果再去 +C。前面說的是,當 C 要執行 A+B 之前, 未必先把 A 的值計算出來,還是先把 B 的值計算出來。

這一節所談的事,大部分情況下不會發生。 但是,您最好還是要知道這種情況的可能性。

習題

  1. 使用以前寫的 ipow(),請問以下語句
        int n=3;
        printf("%d %d\n", ++n, ipow(2,n));
    
    可能得到哪些結果?各是為什麼?

[ 前一節 ]‧[ 後一節 ]‧[ 回目錄 ]



注意:此處所有文件均為原著,個別的版權宣告日後會一一公布, 整體版面設計亦尚未完成。但仍請勿抄襲文字與圖片,以免觸犯著作權法。

Created: Apr 22, 2000
Last Revised: May 16, 2000
© Copyright 2000 Wei-Chang Shann 單維彰

shann@math.ncu.edu.tw