-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
Hi,
I am quite confused on a equation, as following:
#include <iostream>
int main(){
int i = 2;
int c = (++i)+(++i)+(++ i);
std::cout << c << std::endl;
}
In my mind, the final result should be 12, since 3+4+5. But the result I
got is interesting.
Visual C++ .Net 2005 (8.0) - C++: Result: 15
Visual C++ .Net 2005 (8.0) - C++/CLI: Result: 15
Visual C++ 6.0 Result: 13
Borland C++ Builder 5 Result: 12
gcc version 3.4.2 (mingw-special): Result: 13
g++ (GCC) 4.0.1 20050727 (Red Hat 4.0.1-5) Result: 13
Visual C# .Net 2005 - C# Result: 12
Java version "1.5.0_04" Result: 12
I tried to see the assembly of the executable file. I found they
implemented quite different. Is there anyone can tell me why? Which one
is correct? How the C++ standard explain it?
The corresponding assembly code is following:
Visual C++ .Net 2005 (8.0) - C++:
Result: 15
int c = (++i)+(++i)+(++ i);
004113C5 mov eax,dword ptr [i]
004113C8 add eax,1
004113CB mov dword ptr [i],eax
004113CE mov ecx,dword ptr [i]
004113D1 add ecx,1
004113D4 mov dword ptr [i],ecx
004113D7 mov edx,dword ptr [i]
004113DA add edx,1
004113DD mov dword ptr [i],edx
004113E0 mov eax,dword ptr [i]
004113E3 add eax,dword ptr [i]
004113E6 add eax,dword ptr [i]
004113E9 mov dword ptr [c],eax
Visual C++ .Net 2005 (8.0) - C++/CLI:
Result: 15
int c = (++i)+(++i)+(++ i);
00000022 inc esi
00000023 inc esi
00000024 inc esi
00000025 lea eax,[esi+esi]
00000028 add eax,esi
0000002a mov ebx,eax
gcc version 3.4.2 (mingw-special):
Result: 13
int c = (++i)+(++i)+(++ i);
40147f: 8d 45 e4 lea 0xffffffe4(%ebp ),%eax
401482: ff 00 incl (%eax)
401484: 8d 45 e4 lea 0xffffffe4(%ebp ),%eax
401487: ff 00 incl (%eax)
401489: 8b 45 e4 mov 0xffffffe4(%ebp ),%eax
40148c: 8b 55 e4 mov 0xffffffe4(%ebp ),%edx
40148f: 01 c2 add %eax,%edx
401491: 8d 45 e4 lea 0xffffffe4(%ebp ),%eax
401494: ff 00 incl (%eax)
401496: 89 d0 mov %edx,%eax
401498: 03 45 e4 add 0xffffffe4(%ebp ),%eax
40149b: 89 45 e0 mov %eax,0xffffffe0 (%ebp)
g++ (GCC) 4.0.1 20050727 (Red Hat 4.0.1-5)
Result: 13
int c = (++i)+(++i)+(++ i);
leal -8(%ebp), %eax
incl (%eax)
leal -8(%ebp), %eax
incl (%eax)
movl -8(%ebp), %eax
movl -8(%ebp), %edx
addl %eax, %edx
leal -8(%ebp), %eax
incl (%eax)
movl %edx, %eax
addl -8(%ebp), %eax
Visual C# .Net 2005 - C#
Result: 12
int c = (++i) + (++i) + (++i);
0000002e inc esi
0000002f mov ebx,esi
00000031 inc esi
00000032 add ebx,esi
00000034 inc esi
00000035 add ebx,esi
00000037 mov edi,ebx
Java version "1.5.0_04"
Result: 12
public static void main(java.lang. String[]);
Code:
0: iconst_2
1: istore_1
2: iinc 1, 1
5: iload_1
6: iinc 1, 1
9: iload_1
10: iadd
11: iinc 1, 1
14: iload_1
15: iadd
16: istore_2
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.1 (GNU/Linux)
Comment: Using GnuPG with Fedora - http://enigmail.mozdev.org
iD8DBQFDcdVPRS5 AkKgtcCcRApTaAJ 4xOmWHjBooT+TB4 cmTjS7HB5EHAwCf eA0Q
N3wXlSuyQhDGsb9 hrWDU4f4=
=+COH
-----END PGP SIGNATURE-----