סתכל על:
#include <stdio.h>int main() { int a,b; b = 5; a = b++; return 0; }
|
לעומת:
#include <stdio.h>int main() { int a,b; b = 5; a = ++b; return 0; }
|
הראשון מתרגם לאסמבלי הבא: (gcc)
0x08048374 <main+0>: push ebp 0x08048375 <main+1>: mov ebp,esp 0x08048377 <main+3>: sub esp,0x10 0x0804837a <main+6>: mov DWORD PTR [ebp-0x4],0x5 0x08048381 <main+13>: mov eax,DWORD PTR [ebp-0x4] 0x08048384 <main+16>: mov DWORD PTR [ebp-0x8],eax 0x08048387 <main+19>: add DWORD PTR [ebp-0x4],0x1 0x0804838b <main+23>: mov eax,0x0 0x08048390 <main+28>: leave 0x08048391 <main+29>: ret
|
והשני ל
0x08048374 <main+0>: push ebp 0x08048375 <main+1>: mov ebp,esp 0x08048377 <main+3>: sub esp,0x10 0x0804837a <main+6>: mov DWORD PTR [ebp-0x4],0x5 0x08048381 <main+13>: add DWORD PTR [ebp-0x4],0x1 0x08048385 <main+17>: mov eax,DWORD PTR [ebp-0x4] 0x08048388 <main+20>: mov DWORD PTR [ebp-0x8],eax 0x0804838b <main+23>: mov eax,0x0 0x08048390 <main+28>: leave 0x08048391 <main+29>: ret
|
כמו שאתה רואה, ההבדל הוא רק בסדר, שום העתקה שום דבר.
אני בכלל לא מבין מה הביסוס של החידה הזו, כי אין שום סיבה שאני יכול לחשוב עליה, שקומפיילר נורמלי יעתיק אובייקטים בגללו, אולי אני טועה, כי בכל זאת החידה הזו רצה ברשת שנים, אבל אף פעם לא חשבתי על מקרה שמחייב ההעתקה, וכל קומפיילר נורמלי יעשה את זה כמו שצריך.