[課業] c語言 運算元

看板Examination作者時間7年前 (2017/05/10 00:24), 編輯推噓6(6016)
留言22則, 6人參與, 最新討論串1/1
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.htmlmike31830:轉錄至看板 Grad-ProbAsk 05/10 00:35

05/10 00:44, , 1F
由右向左 跟 先乘除後加減 是兩回事吧
05/10 00:44, 1F

05/10 07:56, , 2F
所謂先乘除後加減,其實就是運算子的優先權順序,在程式定
05/10 07:56, 2F

05/10 07:57, , 3F
義時期就已經定義完成了,不管在哪裡計算都不會改變;而您
05/10 07:57, 3F

05/10 07:57, , 4F
說的由右而左的右結合,則是依編譯器決定,不同編譯器,可
05/10 07:57, 4F

05/10 07:57, , 5F
能有不同結合情形。
05/10 07:57, 5F

05/10 08:04, , 6F
簡單說,運算子優先權不用題目說,是必要條件。而由右而左
05/10 08:04, 6F

05/10 08:04, , 7F
是像a+b(先計算b,再計算a),且a/b的右結合,也是先計算b
05/10 08:04, 7F

05/10 08:04, , 8F
,再計算a,可是a/b的定義不會變呀,是程式定義的a除b。
05/10 08:04, 8F

05/10 08:41, , 9F
答案錯 用程式實際跑 result1=46 result2=48
05/10 08:41, 9F

05/10 10:48, , 10F
因為雖然先乘除後加減,但先計算右邊的運算元的值為何。
05/10 10:48, 10F

05/10 12:55, , 11F
你知道你的編譯器是由左到右還是右到左嗎
05/10 12:55, 11F

05/10 13:07, , 12F
這題本來就不能用實際程式的結果當答案啊
05/10 13:07, 12F

05/10 13:09, , 13F
to assu大,這題就是要視編譯器而定,像一般pascal是由左
05/10 13:09, 13F

05/10 13:09, , 14F
而右,C是由右而左,但是如p大所言,實際仍視編譯器而定。
05/10 13:09, 14F

05/10 13:09, , 15F
考試時,可沒編譯器呀
05/10 13:09, 15F

05/10 13:38, , 16F
我是覺得這題一樣先乘除後加減,只是右邊那個括號先做 然
05/10 13:38, 16F

05/10 13:38, , 17F
後再算左邊的
05/10 13:38, 17F

05/10 13:39, , 18F
Btw 怎麼每年程式語言都出這種啊 冏 我記得板上對類似的題
05/10 13:39, 18F

05/10 13:39, , 19F
目就有很多討論了
05/10 13:39, 19F

05/10 13:48, , 20F
運算子 運算元 是不一樣的
05/10 13:48, 20F

05/11 21:21, , 21F
我的話 會先在答案第一行寫 依一般運算方式,相同優先權
05/11 21:21, 21F

05/11 21:21, , 22F
之運算以左結合為主
05/11 21:21, 22F
文章代碼(AID): #1P4Uqjzd (Examination)