On 02/21/2012 03:18 PM, 嘉谟 wrote: > I do a experiments to check how gcc pass the arguments. > here is the code > > #include <stdio.h> > int main(int argc , char *argv[]){ > int a=3; > int b=3; > int c=3; > printf("%d %d\n",++a+c,a+c); > printf("%d %d\n",++b,b); > return 0; > } > > the anwer is > > 8 7 > 4 4 > > the piece of assembly language: gcc 4.6.2 > > movl $3, 28(%esp) > movl $3, 24(%esp) > movl $3, 20(%esp) > movl 20(%esp), %eax > movl 28(%esp), %edx > leal (%edx,%eax), %ecx > addl $1, 28(%esp) > movl 20(%esp), %eax > movl 28(%esp), %edx > addl %eax, %edx > movl $.LC0, %eax > movl %ecx, 8(%esp) > movl %edx, 4(%esp) > movl %eax, (%esp) > call printf > addl $1, 24(%esp) > movl $.LC0, %eax > movl 24(%esp), %edx > movl %edx, 8(%esp) > movl 24(%esp), %edx > movl %edx, 4(%esp) > movl %eax, (%esp) > call printf > > In the first case , gcc first compute the a+c to %ecx ,and pass it > stack , the compute ++a+c to %edx ,so the answer is 8 7 > > In the second case , why it didn't do the same thing like > compute b=3 and pass it to stack ,then compute ++b and pass it to > stack .to the result 4 3. However it first > addl $1, 24(%esp) ==> b+1 I think it compute the expression > b+1. the pass it to stack . the b which now is 4 and was passed to > stack. > > I was wondering why gcc handle the same mode in two ways. > > Is there some errors I had made ?
http://c-faq.com/expr/evalorder2.html Andrew.