C語言對表示式的求值順序不是明確規定的

2022-06-07 04:21:06 字數 543 閱讀 3918

討論區看到的

wa來自那些遞迴下降求解的**.

第一種情況,使用|| 和 &&:

例如s為所給串

int getval()

}這種情況簡單,大家知道短路求值吧,先對 ||左邊的表示式求值,如果非0,則不會對右邊的表示式求值,&&同理,如果左邊為0,不會對右邊求值,這樣下標就不會按照事先設想的增加

第二種情況,使用&和|:

int getval()

}首先這段**用g++會ac,c++會wa,說明此段**依賴編譯器,是未定義的**

錯誤原因: c語言對表示式的求值順序不是明確規定的,而g++是從左從左向右求值,c++則正好相反,比如: getval() | getval() g++先對左邊的getval()求值,而c++則先對右邊的getval()求值,也就會導致對s的訪問順序不會按預先的步驟進行,所以用g++會ac,c++會wa掉

正確的寫法,去掉那些跟依賴求值順序的**(好習慣),分別求值,用兩個臨時變數儲存,這樣g++和c++都ac了:

int getval()

}

c 表示式求值順序

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

C 運算表示式求值順序

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

C語言 用棧實現表示式求值 順序棧

棧的基本操作 優先順序函式 precede 求值函式 operate 判斷操作符函式 in 表示式求值函式 evaluateexpression 其他 操作符棧 optr 運算元棧 opnd 請輸入表示式 3 5 2 第一種輸入方式是直接打出表示式進行整體輸入,而第二種則是以乙個乙個的方式讀入,第一...