第二章 型別、運算子、表示式

tooooo_young發表於2015-07-25

1  c語言沒有指定同一運算子中多個運算元的計算順序(&& 、||、?:和,運算子除外。例如,在形如

                 x  = f ( ) + g ( );

      的語句中,f ( )可以在g ( )之前計算,也可以在g ( )之後計算。因此,如果函式 f  和 g 改變了另一個函式所使用的變數,那麼x的結果可能會依賴於這兩個函式的計算順序。為保證特定的計算順序,可以把中間結果儲存在中間變數中。

類似地,c語言也沒有指定函式各引數的求值順序。因此,下列語句

  printf ( "%d %d \n", ++n, power ( 2,n ));   //錯

 在不同的編譯器中可能會產生不同的結果,這取決於n的自增運算在power呼叫之前還是之後執行。解決的辦法是把該語句改寫成下列形式:

   ++n;

  printf ( "%d %d \n", n, power( 2,n));

還有類似地  a[i] = i++;

問題是:陣列下表i是引用舊值還是新值?對這種情況編譯器的解釋可能不同,並因此產生不同的結果。

c院標準對大多數這類問題有意未作具體規定。

表示式何時會產生這種副作用(對變數賦值),將由編譯器決定,因為最佳的求值順序同機器結構有很大關係。

2   逗號運算子“ , ”,也是C語言優先順序最低的運算子,在for語句中經常會用到它。被逗號分隔的一對錶達式將按照從左到右的順序進行求值,各表示式右邊的運算元的型別和值即為其結果的型別和值。

  在某些情況下的逗號並不是逗號運算子,比如分隔函式引數的逗號,分隔宣告中的變數的逗號等,這些逗號並不保證各表示式按從左至右的順序求值。

3  break語句可用於從for、while、do-while、switch等迴圈中提前退出。

    continue語句用於使for、while、或do-while語句開始下一次迴圈的執行。在while與do-while語句中,continue語句的執行意味著立即執行測試部分;在for迴圈中,則意味著使控制轉移到遞增迴圈變數部分。continue語句只用於迴圈語句,不用於switch語句。某個迴圈中包含的switch語句中的continue語句,將導致進入下一次迴圈。

相關文章