This is the mail archive of the gcc-help@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: output difference between VC and gcc


On Saturday 17 July 2010 06:48:35 Peter wrote:
> Hi,
> I have the following code compiled in both microsoft VC 2008 and gcc
> version 4.1.2 20071124.
> 
> The output is different.
> 
> #include<stdio.h>
> void main(void)
> {
>     int i,tab[]={1,2,3,4,5,6,7,8,9,10};
> 
>     i=0;
>     while(i<10){
>         printf("%d  ",i);
>         printf("%d:%d\n",i,tab[i++]);
>     }
> }
> 
> [...]
> 
> based on C standard, whose output is correct?
> thanks.

GCC's, although it's interesting that visual studio does what one expects: 
print i, print tab[i], then increment i. However, keeping in mind that 
parameters are pushed on stack in reverse:

  mov    0xfffffff4(%ebp),%eax
  pushl  0xffffffb8(%ebp,%eax,4)
  lea    0xfffffff4(%ebp),%eax
  incl   (%eax)
  pushl  0xfffffff4(%ebp)
  push   $0x80484f1
  call   80482b0 <_init+0x38>

things actually happen: print tab[i], print ( i + 1 ). Given the right 
options, gcc can warn about this:

gcc -W -Wall test.c 
...
test.c: In function `main':
test.c:9: warning: operation on `i' may be undefined

Unfortunately, many programmers don't know these details and VS helps avoid 
undesired results:

  mov     ecx, [ebp+var_4]
  mov     edx, [ebp+ecx*4+var_2C]
  mov     [ebp+var_30], edx
  mov     eax, [ebp+var_30]
  push    eax
  mov     ecx, [ebp+var_4]
  push    ecx
  push    offset aDD
  call    _printf
  add     esp, 0Ch
  mov     edx, [ebp+var_4]
  add     edx, 1 ; <---- i++
  mov     [ebp+var_4], edx

Thumb's up to VS. :-)

-- 
Mihai DonÈu


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]