看板 C_and_CPP 關於我們 聯絡資訊
這是另一種版本 不要說大家都欺負你 故意寫很噁心的程式 比之前的好懂多了吧 #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)
james732:extern SUM; 這行會有問題 05/05 23:23
walker2009:我好想吐... XDD 05/05 23:24
james732:不過這個真的有比較好懂嗎...XDDDDD 05/05 23:26
loveflames:我用的compiler能過,其實那行拿掉也沒差,本來就是混 05/05 23:26
loveflames:淆視聽用的 05/05 23:26
james732:原來如此 XDDD 05/05 23:27
loveflames:完全沒有1500這個數字 05/05 23:27
loveflames:extern那行改成"int SUM=1499;"的話,你能編譯過嗎 05/05 23:29
LPH66:printf 怎麼會是印 SUM 呢 XD 05/05 23:30
loveflames:用上了一點邪惡技巧,仔細看一下strcpy 05/05 23:31
※ 編輯: loveflames 來自: 140.134.226.149 (05/05 23:33)
LPH66:我是猜得到你想說什麼啦 但我的VC把1501給丟進sum裡去了lol 05/05 23:34
jawychiou:好邪惡的傢伙 XD 05/05 23:34
james732:原本程式在gcc可以編 extern改掉反而不行了 真神.... 05/05 23:35
loveflames:memcpy沒把SUM的值蓋掉? 05/05 23:35
loveflames:改成"int SUM=1499;"後反而不行? 05/05 23:36
LPH66:在我的VC上兩個都沒 XD 05/05 23:36
james732:啊 剛剛gcc不行是因為忘了把最後一行刪掉 XD 刪掉即可 05/05 23:37
loveflames:那sum()裡的strcpy有達成目的吧? 05/05 23:39
LPH66:就說兩個都沒了 XD 05/05 23:39
loveflames:附註一下,正確結果是1125750 05/05 23:40
netsphere:厲害 完全不想看code 05/05 23:42
loveflames:會不會是它沒有把變數連續放?不過這得看一下stack 05/05 23:45
LPH66:啊, 我懂了 裡面的之所以沒成功是因為我的VC備份了esi/edi 05/05 23:46
dendrobium:噁心+1 XD 05/05 23:46
LPH66:而外面的沒成功好像是因為一個神奇的 alignment... 05/05 23:47
LPH66:它變成了[sum][???][???][???][--SuM-][???][SUM] .... 05/05 23:48
LPH66:順帶一提, release 的最佳化會把 {} 給丟掉 XD 05/05 23:49
loveflames:放暫存器值備份的地方是在參數跟local變數之間? 05/05 23:50
LPH66:對 和 ebp 的備份放在一起 05/06 00:02
LPH66:不過各家 compiler 有沒有多備份真的說不準就是了... 05/06 00:03
LPH66:(因為會備份的原因應該是函式裡用到了它們) 05/06 00:04
loveflames:你指的備份是函式開頭push ebp、push xxx之類的沒錯吧 05/06 00:07
loveflames:你用的compiler是先備份再分配local變數的空間? 05/06 00:07
LPH66:唔...經你這麼一說才發現我好像弄錯了 @_@ 05/06 00:17
LPH66:我這裡的函式裡應該是這樣: Sum 對齊了 8 byte 05/06 00:22
LPH66:然後在那之後還有一個用意不明的 local 變數空間 05/06 00:22
LPH66:所以一共差了 8 byte... 05/06 00:22
loveflames:跟sUm差8 byte? 05/06 00:23
LPH66:你期望的是 [Sum][ebp][ret][SUM] 05/06 00:26
LPH66:但我這裡卻是 [Sum][???][unk][ebp][ret][SUM] 05/06 00:28
LPH66:[unk] 就是那個用意不明的 local 變數空間 05/06 00:28
LPH66:[???]則是因為對齊的關係空出來的空間 05/06 00:29
loveflames:unk???看來在push ebp後,偷塞了一些怪東西到stack 05/06 00:30
loveme00835:完全不想看+1 XD 05/06 00:36
※ 編輯: loveflames 來自: 140.134.226.149 (05/06 04:15)
LinuxC:不想看+1 老子我早就在腦中寫好了 05/06 09:02