Fw: [課業] c語言 運算元

看板Grad-ProbAsk作者時間8年前 (2017/05/10 00:35), 編輯推噓7(7017)
留言24則, 5人參與, 最新討論串1/1
※ [本文轉錄自 Examination 看板 #1P4Uqjzd ] 作者: mike31830 () 看板: Examination 標題: [課業] c語言 運算元 時間: Wed May 10 00:24:10 2017 int abc(int *k) { *k += 4; return 3 * ( *k) - 1; } void main() { int i = 10, j = 10, result1, result2; result1 = (i / 2) + abc( &i); result2 = abc( &j) + (j / 2); } 如果在運算式中的運算元估算的順序是由右到左,則result1,則result2的值為何? 看了補習班答案是 result1=48, result2=46 result1= (i/2) + abc(&i) = (14/2) + 41 (*k=14; 3*14 - 1=41) = 48 想問的是,為什麼在abc裹的計算是先乘除後加減呢 而不是由右到左推算呢 因為本題沒有提運算子優先權,是不是應該照題目要求一律從右到左呢 謝謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 54.183.135.27 ※ 文章網址: https://www.ptt.cc/bbs/Examination/M.1494347053.A.F67.html ※ 發信站: 批踢踢實業坊(ptt.cc) ※ 轉錄者: mike31830 (54.183.135.27), 05/10/2017 00:35:06

05/10 01:14, , 1F
呃,你搞錯了,C expression 是由左往右的
05/10 01:14, 1F

05/10 01:14, , 2F
沒有提到運算子優先權,請自行參閱 C precedence
05/10 01:14, 2F

05/10 01:15, , 3F
這題的重點是 C compiler 會先對 operand 進行
05/10 01:15, 3F

05/10 01:16, , 4F
value computation,才會開始計算 expression
05/10 01:16, 4F

05/10 01:19, , 5F
啊...抱歉,我搞錯問題了,這題的答案應該是未定義的
05/10 01:19, 5F

05/10 01:20, , 6F
舉 C++ 而言他沒有定義 operand 的求值順序
05/10 01:20, 6F

05/10 01:21, , 7F
(實務上由 compiler 任意決定) 補習班的答案看看就好
05/10 01:21, 7F

05/10 01:21, , 8F
與 i = i++ 異曲同工的一題
05/10 01:21, 8F

05/10 01:24, , 9F
天啊...我再回答什麼... (看到未定義行為太興奮)
05/10 01:24, 9F

05/10 01:25, , 10F
總之,題目的設定是為了避免我5~8F描述的情況
05/10 01:25, 10F

05/10 01:25, , 11F
至於你的問題,你應該去練習寫一下程式。
05/10 01:25, 11F

05/10 09:00, , 12F
k大題目有假定由右往左
05/10 09:00, 12F

05/10 09:00, , 13F
運算子優先順序"大於"結合律,結案!
05/10 09:00, 13F

05/10 09:01, , 14F
這題就是優先權相同下右結合,而優先權既然題目沒要求
05/10 09:01, 14F

05/10 09:01, , 15F
當然不變
05/10 09:01, 15F

05/10 10:42, , 16F
不是,這跟結合律並沒有關係。
05/10 10:42, 16F

05/10 10:45, , 17F
運算依然是左結合。題目的假設與此無關,此假設是定義
05/10 10:45, 17F

05/10 10:45, , 18F
operand 求值順序,避免 side effect 會帶來 undefin
05/10 10:45, 18F

05/10 10:45, , 19F
ed behavior
05/10 10:45, 19F

05/10 11:24, , 20F
undefined behavior+1 因為sequence point每個compiler
05/10 11:24, 20F

05/10 11:25, , 21F
實作未必如你所想由左而右 因為+號並沒有保證side effect
05/10 11:25, 21F

05/10 11:25, , 22F
的順序
05/10 11:25, 22F

05/11 08:42, , 23F

05/11 08:43, , 24F
!我看懂樓上幾樓了 我也順便學了一下
05/11 08:43, 24F
文章代碼(AID): #1P4U-xtY (Grad-ProbAsk)