Solved

# Simple question about ++ and --

Posted on 2002-05-07
176 Views
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
Question by:StingRaY

LVL 16

Accepted Solution

AlexNek earned 50 total points
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

LVL 4

Expert Comment

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

LVL 30

Expert Comment

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

LVL 30

Expert Comment

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

LVL 16

Expert Comment

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

LVL 30

Expert Comment

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

LVL 30

Expert Comment

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

LVL 16

Expert Comment

0

LVL 16

Expert Comment

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

LVL 30

Expert Comment

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

LVL 16

Expert Comment

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

LVL 15

Author Comment

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.

0

## Featured Post

### Suggested Solutions

Templates For Beginners Or How To Encourage The Compiler To Work For You Introduction This tutorial is targeted at the reader who is, perhaps, familiar with the basics of C++ but would prefer a little slower introduction to the more ad…
Go is an acronym of golang, is a programming language developed Google in 2007. Go is a new language that is mostly in the C family, with significant input from Pascal/Modula/Oberon family. Hence Go arisen as low-level language with fast compilation…
The goal of the video will be to teach the user the difference and consequence of passing data by value vs passing data by reference in C++. An example of passing data by value as well as an example of passing data by reference will be be given. Bot…
The viewer will learn how to user default arguments when defining functions. This method of defining functions will be contrasted with the non-default-argument of defining functions.