Can someone tell me how prefix / postfix operators really work? I've been looking online a lot but haven't found anything.
From what I can tell prefex first increments, then does the operation and then assigns.
Postfix would do the operation first, then assign and then increment.
But I'm having a bit of trouble with my code:
int x, y; x = 1; y = x + x++; // (After operation y = 2)(x=2)
However when I do:
y = x++ + x; // (After operation y = 3)(x=2)
I'm not sure why these operations would be any different. I have two questions:
Could you explain the difference?
How does this apply to the other operator Prefix?
The prefix and postfix increment both increase the value of a number by 1. The only difference between the two is their return value. The former increments ( ++ ) first, then returns the value of x , thus ++x . The latter returns the value of x first, then increments ( ++ ), thus x++ .
Prefix: An expression is called the prefix expression if the operator appears in the expression before the operands. Simply of the form (operator operand1 operand2). Postfix: An expression is called the postfix expression if the operator appears in the expression after the operands.
What is the difference between x++ and ++x? X++ is post increment and ++x is pre increment. X++ value is incremented after value assign or printed.
Postfix decrement operator means the expression is evaluated first using the original value of the variable and then the variable is decremented(decreased). Prefix increment operator means the variable is incremented first and then the expression is evaluated using the new value of the variable.
This question gets asked a fair amount. Be warned that every time someone asks this question a great many people post incorrect answers. Lots of people have incorrect ideas about how these operators work, including people who write programming books and thereby teach other people falsehoods. Read the other answers here very carefully.
For a correct analysis of the C# behaviour, see:
What is the difference between i++ and ++i?
For C++ any behaviour is correct behaviour, in those cases where you are observing a side effect. C++ does not define when the side effect of the increment is visible. Any two compilers can do it differently.
A good rule to follow is to not rely on the order in which side effects happen in any language, but certainly do not rely on it in C++, because it is not reliable.
To look at your specific case:
int x, y; x = 1; y = x + x++;
You report that x and y are both 2. That is correct in C#. In C# the correct behaviour is:
So x and y are both 2 in C#.
C++ can do the same thing, but it is permitted to evaluate the addition in right-to-left order. That is, it is permitted to do:
C++ is also permitted to do this:
So in C++, you can get y as 3 or 2, depending on the whim of the compiler writer. In C# you always get that y is 2. In C++, the increment's assignment can happen at any time, as long as it does happen. In C#, the increment's assignment must happen after the incremented value is computed and before the original value is used. (When observed from the executing thread; if you are trying to observe this stuff from another thread or threads, all bets are off.)
In your second example:
y = x++ + x;
In C# the required behaviour is:
So the correct answer in C# is that y is 3 and x is 2.
Again, C++ can do these steps in any order. C++ is permitted to do:
Again, in C++ the correct answer is that y is 2 or 3, depending on the whim of the compiler writer. In C# the correct answer is that y is 3.
+
are evaulated in left-to-right order.+
is unspecifed.For C# your examples work as follows:
y = x + x++; ^ x is 1 ^ x is increased to 2, but the postfix increment returns the old value (1) y = 2 y = x++ + x; ^ x becomes 2, but postfix increment returns the old value (1) ^ x is now 2 here y = 3
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With