c 表示式求值順序

2021-08-03 12:55:29 字數 540 閱讀 7100

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

template

rank yvector::find(const t &e) const

template

rank yvector::find(const t &e) const

上面的兩段**中第一段能夠實現相應功能,第二段有點問題,問題在於當輸入的值位於向量的末端時,它就找不到了。原因跟c++表示式求值順序有關,在c++中,邏輯與&&運算子規定先求左側運算子的值,只有當左側運算子的值為真時才求右側運算子的值。由於這條規則,在執行while ((cmp--) && (e != _elem[cmp]));這一句時,會先計算cmp–,然後,使得cmp的值在剛開始就減一,導致右側的_elem[cmp]跳過向量中最後乙個值。

表示式(二) 求值順序

基於 c primer p123 1.求值順序 優先順序 結合律 對於 f g h j 1 優先順序規定 g 的返回值於 h 的返回值相乘。2 結合律規定 f 的返回值先於 g 和 h 的乘積相加,隨後與 j 的返回值相加。3 對於這些函式的呼叫順序沒有規定。因此,若其中某幾個函式影響同一物件,就是...

C 運算表示式求值順序

優先順序雖然規定了運算物件的組合方式,但是沒有說明運算物件按照什麼順序求值。例如 int i f1 f2 我們不知道先求f1還是先求f2,倘若f1和f2指向並修改了同一物件,則會引發錯誤。例如 int i 0 cout 結果 本人在vs2017中得到的允許結果為1 1,這個就是錯誤表示式,產生未定義...

C 表示式求值

1 問題描述 輸入為四則運算表示式如 2 3 5 7 9 3,僅由 構成,沒有空格,要求其值。2 問題分析 有兩種方法,一是用遞迴,將表示式分解為項和因子,再通過遞迴逐塊解決。其中,我們需要清楚的是,表示式為項的加減,項為因子的乘除,因子為數值或帶括號的表示式。第二種方法是通過堆疊,先將表示式轉化成...