[爆卦]c語言運算子順序是什麼?優點缺點精華區懶人包

為什麼這篇c語言運算子順序鄉民發文收入到精華區:因為在c語言運算子順序這個討論話題中,有許多相關的文章在討論,這篇最有參考價值!作者mike31830 ()看板Grad-ProbAsk標題Fw: [課業] c語言 運算元時間We...


※ [本文轉錄自 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
kyuudonut: 呃,你搞錯了,C expression 是由左往右的 05/10 01:14
kyuudonut: 沒有提到運算子優先權,請自行參閱 C precedence 05/10 01:14
kyuudonut: 這題的重點是 C compiler 會先對 operand 進行 05/10 01:15
kyuudonut: value computation,才會開始計算 expression 05/10 01:16
kyuudonut: 啊...抱歉,我搞錯問題了,這題的答案應該是未定義的 05/10 01:19
kyuudonut: 舉 C++ 而言他沒有定義 operand 的求值順序 05/10 01:20
kyuudonut: (實務上由 compiler 任意決定) 補習班的答案看看就好 05/10 01:21
kyuudonut: 與 i = i++ 異曲同工的一題 05/10 01:21
kyuudonut: 天啊...我再回答什麼... (看到未定義行為太興奮) 05/10 01:24
kyuudonut: 總之,題目的設定是為了避免我5~8F描述的情況 05/10 01:25
kyuudonut: 至於你的問題,你應該去練習寫一下程式。 05/10 01:25
shownlin: k大題目有假定由右往左 05/10 09:00
imindflow: 運算子優先順序"大於"結合律,結案! 05/10 09:00
shownlin: 這題就是優先權相同下右結合,而優先權既然題目沒要求 05/10 09:01
shownlin: 當然不變 05/10 09:01
kyuudonut: 不是,這跟結合律並沒有關係。 05/10 10:42
kyuudonut: 運算依然是左結合。題目的假設與此無關,此假設是定義 05/10 10:45
kyuudonut: operand 求值順序,避免 side effect 會帶來 undefin 05/10 10:45
kyuudonut: ed behavior 05/10 10:45
TWkobe: undefined behavior+1 因為sequence point每個compiler 05/10 11:24
TWkobe: 實作未必如你所想由左而右 因為+號並沒有保證side effect 05/10 11:25
TWkobe: 的順序 05/10 11:25
ryan0508: http://i.imgur.com/pGJVwtz.jpg 05/11 08:42
ryan0508: !我看懂樓上幾樓了 我也順便學了一下 05/11 08:43

你可能也想看看

搜尋相關網站