why get different result of a simple code on different compiler?

T

Tao Wang

-----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
004113C8 add eax,1
004113CB mov dword ptr ,eax
004113CE mov ecx,dword ptr
004113D1 add ecx,1
004113D4 mov dword ptr ,ecx
004113D7 mov edx,dword ptr
004113DA add edx,1
004113DD mov dword ptr ,edx
004113E0 mov eax,dword ptr
004113E3 add eax,dword ptr
004113E6 add eax,dword ptr
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

iD8DBQFDcdVPRS5AkKgtcCcRApTaAJ4xOmWHjBooT+TB4cmTjS7HB5EHAwCfeA0Q
N3wXlSuyQhDGsb9hrWDU4f4=
=+COH
-----END PGP SIGNATURE-----
 
D

deane_gavin

Tao said:
-----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.

You got undefined behaviour. You are lucky that the result you saw was
something other than what you expected.

http://www.parashift.com/c++-faq-lite/misc-technical-issues.html#faq-39.15

<snip>

Gavin Deane
 
S

Sumit Rajan

Tao Wang said:
-----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.

Please see:
http://www.parashift.com/c++-faq-lite/misc-technical-issues.html#faq-39.15
http://www.parashift.com/c++-faq-lite/misc-technical-issues.html#faq-39.16

http://www.angelikalanger.com/Articles/VSJ/SequencePoints/SequencePoints.html


Regards,
Sumit.
 
T

Tao Wang

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Sumit said:
Oh, I see, Thanks

Dancefire
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.1 (GNU/Linux)
Comment: Using GnuPG with Fedora - http://enigmail.mozdev.org

iD8DBQFDcfmyRS5AkKgtcCcRAkvgAJ0a4AgEtrUVD09/77Qq8g17wzpA3wCfc2px
zIW7e9zLqEgDZFWwXaM06DQ=
=DUvx
-----END PGP SIGNATURE-----
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,769
Messages
2,569,580
Members
45,054
Latest member
TrimKetoBoost

Latest Threads

Top