Go4Expert (http://www.go4expert.com/)
-   C (http://www.go4expert.com/forums/c/)
-   -   Problem in uderstanding associativity and a strange situation (http://www.go4expert.com/forums/uderstanding-associativity-strange-t15055/)

 nishu 8Nov2008 20:41

Problem in uderstanding associativity and a strange situation

//Problem in uderstanding associativity and in the following two situations:

1. If I write in my program

int a=10;
c=++a - a++ - ++a - a++;
printf("%d",c); //output=-24

2.If I write
printf("%d",++a - a++ - ++a - a++); //output=-26

Why does it happen?

In situation 1 value is evaluated as follows:

c=++a - a++ - ++a - a++
c=11-a++ -++a-a++
c=11-11 - ++a - a++
c=11-11-13-13
c=0-13-13
c=-13-13
c=-26

We are evaluating it from left to right.
But Associtivity of Increment(++) and decrement (--) operator is right to left.Don't you think we should evaluate it from right to left? If not please tell me why.

I will be very thankful to you for giving its answer.

 micsom 9Nov2008 11:31

Re: Problem in uderstanding associativity and a strange situation

i think you are using turboC....i too observed this problem in my first yr in college..
but try using other compilers(which are more recent)...
there you will get the same value..ie -24

i dont exactly know the reason for this problem,but i found it a problem which occured with the way a function is called.

 xpi0t0s 9Nov2008 14:31

Re: Problem in uderstanding associativity and a strange situation

Associativity has nothing to do with your confusion. Associativity rules don't apply to pre- and post- increment because they take just a single variable. Addition is associative because a+(b+c) = (a+b)+c. Subtraction is not associative: (1-2)-3=-1-3=-4. 1-(2-3)=1-(-1)=0.

How a compiler handles pre- and post-increment is not defined by the standard and in particular how multiple side effects operating on the same variable in the same expression is left to the compiler writers to determine how it works. So the result depends on the compiler and is very non-portable. Visual Studio handles pre- side effects before evaluating an expression and post- side effects afterwards, evaluating the expression with fixed values. So c=++a - a++ - ++a - a++ is handled as follows: a++; a++; c=a-a-a-a; a++; a++; and since a starts out as 10 c=12-12-12-12=-24. TurboC could well be different. Visual Studio generates the following assembly (my comments prefixed with ---):
Code:

```        int c=++a - a++ - ++a - a++; 00413655  mov        eax,dword ptr [a] 00413658  add        eax,1 0041365B  mov        dword ptr [a],eax  --- a preincrement 0041365E  mov        ecx,dword ptr [a] 00413661  add        ecx,1 00413664  mov        dword ptr [a],ecx --- another preincrement 00413667  mov        edx,dword ptr [a] 0041366A  sub        edx,dword ptr [a] 0041366D  sub        edx,dword ptr [a] 00413670  sub        edx,dword ptr [a] 00413673  mov        dword ptr [c],edx  --- the expression (c=a-a-a-a) 00413676  mov        eax,dword ptr [a] 00413679  add        eax,1 0041367C  mov        dword ptr [a],eax --- a post-increment 0041367F  mov        ecx,dword ptr [a] 00413682  add        ecx,1 00413685  mov        dword ptr [a],ecx --- another post-increment```
> In situation 1 value is evaluated as follows

Are you sure about that? How did you determine how it was evaluated? The only way to be certain is to see what assembly code is generated by the compiler. In any case, clearly you're wrong, because you get -26 but the compiler gets -24.

 nishu 9Nov2008 14:35

Re: Problem in uderstanding associativity and a strange situation