表示式(二) 求值順序

2021-10-07 04:54:36 字數 1260 閱讀 1733

《基於 c++ primer p123>

1.求值順序 & 優先順序 & 結合律:

對於:f( ) + g( ) * h( ) + j( )

(1)優先順序規定:g( ) 的返回值於 h( ) 的返回值相乘。

(2)結合律規定:f( ) 的返回值先於 g( ) 和 h( ) 的乘積相加,隨後與 j( ) 的返回值相加。

(3)對於這些函式的呼叫順序沒有規定。

因此,若其中某幾個函式影響同一物件,就是一條錯誤的表示式,將產生未定義的行為。

2.另外三個例子:

(1)

int i =f1(

)*f2(

);

f1( ) 和 f2( ) 一定會在執行乘法之前被呼叫,但無法知道 f1 是在 f2 之前呼叫還是在 f2 之後呼叫。

(2)

int i =0;

cout << i <<

" "<<

++i << endl;

此表示式的行為是不可預知的。

(3)

while

(beg != s.

end()&&

!isspace

(*beg)

)*beg =

toupper

(*beg++);

// 錯誤:該賦值語句未定義

編譯器可能按照下面的任意一種思路處理該表示式(也可能採取別的什麼方式處理)

*beg =

toupper

(*beg)

;// 先求左側的值

*(beg +1)

=toupper

(*beg)

;// 先求右側的值

3.四個規定了運算物件求值順序的運算子:

(1)&&:先求左側運算物件的值,左為真時求右側運算物件的值。

(2)| |:先求左側運算物件的值,左為假時求右側運算物件的值。

(3)?::先求 cond 的值,若條件為真對 expr1 求值並返回該值;若條件為假對 expr2 求值並返回該值。

(4),:從左向右依次求值。

4.經驗準則:

c++只規定了非常少的二元運算子的求值順序,這樣做提高了**生成的效率,但是可能引發潛在的缺陷。

(1)使用括號強制讓表示式的組合關係符合程式邏輯的要求。

(2)如果改變了某個運算物件的值,在表示式的其他地方不要再使用這個運算物件。

例外:*++iter,遞增運算必須先求值,再輪到解引用運算。

c 表示式求值順序

今天寫了乙個搜尋函式,碰到了乙個有關表示式求值順序的bug,看下面兩段 這是為乙個向量寫的乙個搜尋函式,輸入乙個值,然後返回這個值在向量中的秩rank,如果該值在向量中存在多個,返回最大的,找不到返回 1 template rank yvector find const t e const temp...

表示式求值

程式的說明見清華大學出版社 資料結構 c語言版 include include define stack init size 40 define stackincrement 20 define ok 1 define false 0 typedef structs stack typedef st...

表示式求值

既然是表示式求值,自然需要在記憶體中儲存計算結果以及中間值。在 用c語言寫直譯器 一 中提過 變數要求是若型別,而 c 語言中的 view plaincopy to clipboardprint?in basic io.h define memery size 26 typedef enum var...