根據流程 (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,如果 A 和 B 分別是一個語句, 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 的值計算出來。
這一節所談的事,大部分情況下不會發生。 但是,您最好還是要知道這種情況的可能性。
習題
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 單維彰