[問題] a++ ++a 的問題

看板C_and_CPP作者 (好想看gossip girl..)時間15年前 (2010/10/25 22:25), 編輯推噓6(6035)
留言41則, 15人參與, 最新討論串1/1
#define SQR(x) ((x)*(x)) int y=1 SQR(++y)→((++y)*(++y))=3*3=9 ++y 為先加1 那不是 2*2=4 ? SQR(y++)→((y++)*(y++))=1*1=1 先執行y 再加1 所以1*1沒錯吧? printf("%d %d",SQR(y++),SQR(++y))→9 9 不是該1跟4嗎? 另一題 int i=5,x=10; printf("%d %d %d",x+++--i,x,i); printf("%d %d"x,i); 答案執行結果14 10 5 跟 11 4 想問第一行的x跟i不是已改變為11跟4? 謝謝~ -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 59.113.128.32

10/25 22:25, , 1F
不同的compiler,有不同的實作效果
10/25 22:25, 1F

10/25 22:28, , 2F
請看置底文謝謝
10/25 22:28, 2F

10/25 22:28, , 3F
((x)*(x)) 這個是圖形嗎?
10/25 22:28, 3F

10/25 22:30, , 4F
不要用這種寫法,純自虐
10/25 22:30, 4F

10/25 22:30, , 5F
圖形的平方嗎?
10/25 22:30, 5F

10/25 22:31, , 6F
真佩服第一個想出這類題目的人,影響深遠
10/25 22:31, 6F

10/25 22:34, , 7F
也要考慮printf是什麼類型的呼叫吧
10/25 22:34, 7F

10/25 22:34, , 8F
理論上SQR(++y)會先被push,做這題目的人是在考組語嗎
10/25 22:34, 8F

10/25 22:37, , 9F
根本不想回你這種為定義行為的結果
10/25 22:37, 9F

10/25 22:39, , 10F
對呼叫約定熟的人,這類問題很容易理解
10/25 22:39, 10F

10/25 22:40, , 11F
大部分的新手或中手很少會去碰呼叫約定的部份吧
10/25 22:40, 11F

10/25 22:40, , 12F
準備考試的沒錯..
10/25 22:40, 12F

10/25 22:42, , 13F
我好像建議你不要浪費時間在這種問題上...XD
10/25 22:42, 13F

10/25 22:42, , 14F
假如是PASCAL或Fastcall約定那答案可能又會不一樣
10/25 22:42, 14F

10/25 22:42, , 15F
不過偏偏又可能莫名其妙的考出來 所以....
10/25 22:42, 15F

10/25 22:44, , 16F
原PO去查一下呼叫約定你就知道答案的原由了
10/25 22:44, 16F

10/25 22:46, , 17F
恩恩 謝謝 我去找看看
10/25 22:46, 17F

10/25 22:48, , 18F
原PO還真的去查了...我覺得s大說的不是原PO想要的XD
10/25 22:48, 18F

10/25 22:50, , 19F
知道什麼是呼叫約定又有什麼不好,答案本來就跟這個有關
10/25 22:50, 19F

10/25 22:53, , 20F
我是用c所以是由右到左?
10/25 22:53, 20F

10/25 22:53, , 21F
我的認知,calling convention其實只規定,進堆疊的順序
10/25 22:53, 21F

10/25 22:53, , 22F
call convention 跟這真的沒關係
10/25 22:53, 22F

10/25 22:53, , 23F
如果每個參數的值都是未定義,有時 1,2,3 有時 3,2,1 那順
10/25 22:53, 23F

10/25 22:54, , 24F
序還是影響不了
10/25 22:54, 24F

10/25 22:54, , 25F
C 沒有規定右到左還左到右
10/25 22:54, 25F

10/25 23:08, , 26F
C規範_cdecl是由右到左,所以PO應該能理解答案了吧
10/25 23:08, 26F

10/25 23:14, , 27F
呼叫慣例跟求值順序及副作用是否完成無關
10/25 23:14, 27F

10/25 23:19, , 28F
有沒有關很難定論,我只是說一下答案怎麼來的而已
10/25 23:19, 28F

10/25 23:53, , 29F
所以你想說call convention跟求值順序有關?
10/25 23:53, 29F

10/25 23:54, , 30F
第一題 連看都不用看 macro內部不應該有side effect
10/25 23:54, 30F

10/25 23:54, , 31F
call convention 在相同平台上也根本不只有一種...
10/25 23:54, 31F

10/25 23:55, , 32F
第二題 有難度 but一樣 func call 不應該有side effect!
10/25 23:55, 32F

10/25 23:57, , 33F
這種code根本就不portable,誰知道你下個版本會是哪個結果
10/25 23:57, 33F

10/26 00:04, , 34F
沒人看出來他 printf("%d %d"x,i); 打錯嗎? XD
10/26 00:04, 34F

10/26 00:35, , 35F
由右到左是指push的順序 不是evaluate的順序
10/26 00:35, 35F

10/26 00:37, , 36F
要先計算哪個operand/argument是隨compiler高興
10/26 00:37, 36F

10/26 01:43, , 37F
如果只是運算符優先順的問題,那第二題答案肯定是錯的
10/26 01:43, 37F

10/26 01:44, , 38F
第一題的++y兩個,所以y都變成3,答案是9 9就沒問題了
10/26 01:44, 38F

10/26 02:12, , 39F
但是evaluate時拿到的不一定兩邊都是最新的3吧?
10/26 02:12, 39F

10/26 02:12, , 40F
其實我是真的沒想去搞懂過這種東西就是了啦 哈哈哈哈
10/26 02:12, 40F

10/27 20:15, , 41F
請翻 C++ Primer 4e: Order of Evaluation
10/27 20:15, 41F
文章代碼(AID): #1CnPD6V2 (C_and_CPP)