《基於 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...