• Status: Solved
• Priority: Medium
• Security: Public
• Views: 189

# Simple question about ++ and --

The question is

what is the answer of the following code

int x,n=5;
x=++n*--n
cout << x;

the problem is I solved this code manually and got 30
but if I use VC++, it said 25!

Why? my friend said they use c on AX machine, the answer is 30.

I am confusing
0
StingRaY
1 Solution

Commented:
2 StingRaY
AFIAK: ++ and -- has highest priority as *.
1. n = n+1  // n = 6
2. n = n-1  // n = 5
3. x = n*n  // x = 5*5 = 25
0

Commented:
An expression like
++n*--n is bound to have side effects. The actual interpretation will vary from compiler to compiler. So you are getting different results.
0

Commented:
AlexNek,
It should equal to 30.
If VC++ is comming up with 25, then it's a compiler bug.

3. x = n*n  // x = 6*5 = 30
0

Commented:
To prove it's a compiler bug, run the following code:

int SendNumBack(int n)
{
return n;
}

int main(int argc, char* argv[])
{
int x,n=5, n2=5, n3=6;
x = (++n) * (--n);
std::cout << "x = " << x << std::endl;

x = SendNumBack(++n) * SendNumBack(--n);
std::cout << "x = "  << x << std::endl;

system("pause");
return 0;
}

If the compiler is working properly,  both values will be the same.
You'll notice that VC++ returns two different values.
0

Commented:
2 Axter
I'm sorry but I not agree with you. It is not a compiler error.
The first sample in your code working as I described above, the second use temporary storage.

1. Register X1 = n+1  // n = 6
2. Register X2 = n-1  // n = 5
3. x = Register X1*Register X2  // x = 6*5 = 30

0

Commented:
AlexNek,
What do you think the first example should produce?
x = (++n) * (--n);

That should produce 30, but in VC++, the output is 25.
0

Commented:
AlexNek,
>>The first sample in your code working as I described
>>above, the second use temporary storage.

Both examples should produce the same value in a correctly working compiler.

The first example should equal to the following:
x = (++n) * (--n);
1. (++n) = n+1  // n = 6
2. (--n) = n-1  // n = 5
3. x = (++n)*(--n); // x = 6*5 = 30

And as you have already posted, the second example should also result in a 30.

However, in VC++, the first output is 25, and the second is 30.

This is a bug in the compiler.
0

Commented:
0

Commented:
2 Axter
show me compiler error here, please.

10:   int x,n=5;
mov         [n],5
11:   x=++n*--n;
mov         eax,[n]
mov         [n],eax
mov         ecx, [n]
sub         ecx,1
mov         [n],ecx
mov         edx,[n]
imul        edx,[n]
mov         [x],edx
0

Commented:
AlexNek,
Since it's been decades since I last programmed in assembly language, the above comment has little meaning. :-)

The link you posted seems to support your view point, but it seems to be talking about what order the evaluation should take place in.

1. (++n) = n+1  // n = 6
2. (--n) = n-1  // n = 5
3. x = (++n)*(--n); // x = 6*5 = 30

OR

1. (--n) = n-1  // n = 4
2. (++n) = n+1  // n = 5
3. x = (++n)*(--n); // x = 5*4 = 20

No matter which order it goes in, the value still would not be 25.
0

Commented:
2 Axter

Why you think that left operand in N3 still 5 or 4?

x = current value of N * current value of N
and current value of N in both cases = 5
0

Author Commented:
Thanks AlexNek and Axter.

I am wondering that

when an expression ++n*--n is performed,
where n is stored in memory.

the problem is where should the result of "++n" be kept when ++n is perform.

if result of ++n is stored in the same location of n
n should be updated to 6.

and the same reason --n will change that value to 5

after that VC++ will use that value for multiplication.

I don't know is it correct or not.