Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > C++ > why get different result of a simple code on different compiler?

Reply
Thread Tools

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

 
 
Tao Wang
Guest
Posts: n/a
 
      11-09-2005
-----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

iD8DBQFDcdVPRS5AkKgtcCcRApTaAJ4xOmWHjBooT+TB4cmTjS 7HB5EHAwCfeA0Q
N3wXlSuyQhDGsb9hrWDU4f4=
=+COH
-----END PGP SIGNATURE-----
 
Reply With Quote
 
 
 
 
deane_gavin@hotmail.com
Guest
Posts: n/a
 
      11-09-2005

Tao Wang wrote:
> -----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-lit...html#faq-39.15

<snip>

Gavin Deane

 
Reply With Quote
 
 
 
 
Sumit Rajan
Guest
Posts: n/a
 
      11-09-2005

"Tao Wang" <(E-Mail Removed)> wrote in message
news:lzkcf.12917$(E-Mail Removed)...
> -----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-lit...html#faq-39.15
http://www.parashift.com/c++-faq-lit...html#faq-39.16

http://www.angelikalanger.com/Articl...ncePoints.html


Regards,
Sumit.
--
Sumit Rajan <(E-Mail Removed)>


 
Reply With Quote
 
Geo
Guest
Posts: n/a
 
      11-09-2005

Tao Wang wrote:

> int c = (++i)+(++i)+(++i);


This is undefined behaviour, the rest of the program is irrelevant,
anything could happen.

 
Reply With Quote
 
Tao Wang
Guest
Posts: n/a
 
      11-09-2005
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Sumit Rajan wrote:
> "Tao Wang" <(E-Mail Removed)> wrote in message
> news:lzkcf.12917$(E-Mail Removed)...
>
>>-----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-lit...html#faq-39.15
> http://www.parashift.com/c++-faq-lit...html#faq-39.16
>
> http://www.angelikalanger.com/Articl...ncePoints.html
>
>
> Regards,
> Sumit.

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-----
 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Zlib::GzipWriter - same code - different OS - different result. denmat Ruby 2 04-23-2008 06:45 AM
why why why why why Mr. SweatyFinger ASP .Net 4 12-21-2006 01:15 PM
findcontrol("PlaceHolderPrice") why why why why why why why why why why why Mr. SweatyFinger ASP .Net 2 12-02-2006 03:46 PM
1. Ruby result: 101 seconds , 2. Java result:9.8 seconds, 3. Perl result:62 seconds Michael Tan Ruby 32 07-21-2005 03:23 PM
why i get different result from command line and browser?(not 500 Err) yzhshi Perl 7 04-16-2004 09:04 AM



Advertisments