Re: [問題] 誰能幫我 解答

看板C_and_CPP作者 (咕啾咕啾魔法陣)時間15年前 (2010/05/05 15:17), 編輯推噓15(15030)
留言45則, 9人參與, 最新討論串3/3 (看更多)
這是另一種版本 不要說大家都欺負你 故意寫很噁心的程式 比之前的好懂多了吧 #include<iostream> using namespace std; template<int N> struct add { static const int sum=add<N-1>::sum+N; }; template<> struct add<1> { static const int sum=1; }; int main() { cout<<add<1500>::sum<<endl; system("pause"); return 0; } ---------------------------------------------------------------------------- 這個給你參考一下 沒有define一些怪怪的符號 相信比較好懂 #include <stdlib.h> #include <string.h> #include <stdio.h> extern SUM; void sum(int SUM) { char Sum[4]="123",sUm[16]="abcdefghijklmno"; int SuM=SUM; int *suM=(sUm+12); for(*suM=0;SuM&&(*suM+=SuM--)||strcpy(Sum,sUm)&&!printf("sum=%d\n",SUM);); exit(0); } int main () { int SUM=1501; { char sum[4]; char SuM[8]={'a','b','c','d',0xdc,5,0,0}; memcpy(sum,SuM,8); } sum(SUM); } int SUM=1499; ※ 編輯: loveflames 來自: 140.134.226.149 (05/05 23:20) ※ 編輯: loveflames 來自: 140.134.226.149 (05/05 23:22)

05/05 23:23, , 1F
extern SUM; 這行會有問題
05/05 23:23, 1F

05/05 23:24, , 2F
我好想吐... XDD
05/05 23:24, 2F

05/05 23:26, , 3F
不過這個真的有比較好懂嗎...XDDDDD
05/05 23:26, 3F

05/05 23:26, , 4F
我用的compiler能過,其實那行拿掉也沒差,本來就是混
05/05 23:26, 4F

05/05 23:26, , 5F
淆視聽用的
05/05 23:26, 5F

05/05 23:27, , 6F
原來如此 XDDD
05/05 23:27, 6F

05/05 23:27, , 7F
完全沒有1500這個數字
05/05 23:27, 7F

05/05 23:29, , 8F
extern那行改成"int SUM=1499;"的話,你能編譯過嗎
05/05 23:29, 8F

05/05 23:30, , 9F
printf 怎麼會是印 SUM 呢 XD
05/05 23:30, 9F

05/05 23:31, , 10F
用上了一點邪惡技巧,仔細看一下strcpy
05/05 23:31, 10F
※ 編輯: loveflames 來自: 140.134.226.149 (05/05 23:33)

05/05 23:34, , 11F
我是猜得到你想說什麼啦 但我的VC把1501給丟進sum裡去了lol
05/05 23:34, 11F

05/05 23:34, , 12F
好邪惡的傢伙 XD
05/05 23:34, 12F

05/05 23:35, , 13F
原本程式在gcc可以編 extern改掉反而不行了 真神....
05/05 23:35, 13F

05/05 23:35, , 14F
memcpy沒把SUM的值蓋掉?
05/05 23:35, 14F

05/05 23:36, , 15F
改成"int SUM=1499;"後反而不行?
05/05 23:36, 15F

05/05 23:36, , 16F
在我的VC上兩個都沒 XD
05/05 23:36, 16F

05/05 23:37, , 17F
啊 剛剛gcc不行是因為忘了把最後一行刪掉 XD 刪掉即可
05/05 23:37, 17F

05/05 23:39, , 18F
那sum()裡的strcpy有達成目的吧?
05/05 23:39, 18F

05/05 23:39, , 19F
就說兩個都沒了 XD
05/05 23:39, 19F

05/05 23:40, , 20F
附註一下,正確結果是1125750
05/05 23:40, 20F

05/05 23:42, , 21F
厲害 完全不想看code
05/05 23:42, 21F

05/05 23:45, , 22F
會不會是它沒有把變數連續放?不過這得看一下stack
05/05 23:45, 22F

05/05 23:46, , 23F
啊, 我懂了 裡面的之所以沒成功是因為我的VC備份了esi/edi
05/05 23:46, 23F

05/05 23:46, , 24F
噁心+1 XD
05/05 23:46, 24F

05/05 23:47, , 25F
而外面的沒成功好像是因為一個神奇的 alignment...
05/05 23:47, 25F

05/05 23:48, , 26F
它變成了[sum][???][???][???][--SuM-][???][SUM] ....
05/05 23:48, 26F

05/05 23:49, , 27F
順帶一提, release 的最佳化會把 {} 給丟掉 XD
05/05 23:49, 27F

05/05 23:50, , 28F
放暫存器值備份的地方是在參數跟local變數之間?
05/05 23:50, 28F

05/06 00:02, , 29F
對 和 ebp 的備份放在一起
05/06 00:02, 29F

05/06 00:03, , 30F
不過各家 compiler 有沒有多備份真的說不準就是了...
05/06 00:03, 30F

05/06 00:04, , 31F
(因為會備份的原因應該是函式裡用到了它們)
05/06 00:04, 31F

05/06 00:07, , 32F
你指的備份是函式開頭push ebp、push xxx之類的沒錯吧
05/06 00:07, 32F

05/06 00:07, , 33F
你用的compiler是先備份再分配local變數的空間?
05/06 00:07, 33F

05/06 00:17, , 34F
唔...經你這麼一說才發現我好像弄錯了 @_@
05/06 00:17, 34F

05/06 00:22, , 35F
我這裡的函式裡應該是這樣: Sum 對齊了 8 byte
05/06 00:22, 35F

05/06 00:22, , 36F
然後在那之後還有一個用意不明的 local 變數空間
05/06 00:22, 36F

05/06 00:22, , 37F
所以一共差了 8 byte...
05/06 00:22, 37F

05/06 00:23, , 38F
跟sUm差8 byte?
05/06 00:23, 38F

05/06 00:26, , 39F
你期望的是 [Sum][ebp][ret][SUM]
05/06 00:26, 39F

05/06 00:28, , 40F
但我這裡卻是 [Sum][???][unk][ebp][ret][SUM]
05/06 00:28, 40F

05/06 00:28, , 41F
[unk] 就是那個用意不明的 local 變數空間
05/06 00:28, 41F

05/06 00:29, , 42F
[???]則是因為對齊的關係空出來的空間
05/06 00:29, 42F

05/06 00:30, , 43F
unk???看來在push ebp後,偷塞了一些怪東西到stack
05/06 00:30, 43F

05/06 00:36, , 44F
完全不想看+1 XD
05/06 00:36, 44F
※ 編輯: loveflames 來自: 140.134.226.149 (05/06 04:15)

05/06 09:02, , 45F
不想看+1 老子我早就在腦中寫好了
05/06 09:02, 45F
文章代碼(AID): #1BuOmFJQ (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1BuOmFJQ (C_and_CPP)