Reputation: 116150
I'm having a hard time understanding what the difference is between incrementing a variable in C# this way:
myInt++;
and
++myInt;
When would ever matter which one you use?
I'll give voteCount++ for the best answer. Or should I give it ++voteCount...
Upvotes: 7
Views: 2272
Reputation: 96586
There is no difference when written on its own (as shown) - in both cases myInt will be incremented by 1.
But there is a difference when you use it in an expression, e.g. something like this:
MyFunction(++myInt);
MyFunction(myInt++);
In the first case, myInt is incremented and the new/incremented value is passed to MyFunction(). In the second case, the old value of myInt is passed to MyFunction() (but myInt is still incremented before the function is called).
Another example is this:
int myInt = 1;
int a = ++myInt;
// myInt is incremented by one and then assigned to a.
// Both myInt and a are now 2.
int b = myInt++;
// myInt is assigned to b and then incremented by one.
// b is now 2, myInt is now 3
BTW: as Don pointed out in a comment the same rules are also valid for decrement operations, and the correct terminology for these operations are:
++i; // pre-increment
i++; // post-increment
--i; // pre-decrement
i--; // post-decrement
As Jon Skeet points out:
Others have shown where it makes a difference, and have commented that as a single statement it doesn't make a difference.
I'd like to add that it's almost always a bad idea to use it where it makes a difference. I suspect there may be some times where it's more readable to have code such as:
Console.WriteLine("Foo: {0}", foo++);
than:
Console.WriteLine("Foo: {0}", foo); foo++;
... but they're very rare! The latter of these two samples makes the ordering crystal clear immediately - the former requires a bit of thinking (to my poor brain, anyway). Think of the readability first.
Upvotes: 53
Reputation:
I think it is simplest to understand in terms of the order of evaluation and modification.
(the order of operations is evident in the typed order of the operator and the variable)
I.e. when used in an expression, the postfix operator evaluates and uses the variable's current value in the expression (a return statement or method call) before applying the operator. With the prefix operator it is the other way around.
Upvotes: 3
Reputation: 4131
myInt++ (4 CPU instructions)
LOAD AX, #myInt // From myInt memory to a CPU register
COPY AX, BX
INCREMENT BX
STORE BX, #myInt
// Use AX register for the value
++myInt (3 CPU instructions)
LOAD AX, #myInt // From myInt memory to a CPU register
INCREMENT AX
STORE AX, #myInt
// Use AX register for the value
Upvotes: 4
Reputation: 7189
In assignment or expressions, for example
x = ++myInt; // x = myInt + 1
x = myInt++; // x = myInt
This can also be used in expressions like for loops or if statements. For example take the following where seek is 0 and count is 3.
while(seek++ < count) {
Console.WriteLine(seek);
}
results in outputs of 1, 2 and 3, for seek, and the following
while(++seek < count) {
Console.WriteLine(seek);
}
Results in 1 and 2 for seek. So ++myInt increments myInt before its value is evaluated, where as myInt++ is incremented after it is evaluated.
Upvotes: 6
Reputation: 3204
It determines when the result for that operation is returned.
Here's an example from the MSDN site:
static void Main()
{
double x;
x = 1.5;
Console.WriteLine(++x);
x = 1.5;
Console.WriteLine(x++);
Console.WriteLine(x);
}
And the ouput:
2.5
1.5
2.5
Upvotes: 3
Reputation: 46599
The pre-fix operator ++myInt is a way of reducing lines: increment the variable before passing it to someplace else. It's also a nice way to reduce readability, since it's uncommon.
MyMethod(++myInt);
vs.
myInt++;
MyMethod(myInt);
To me the second is a lot easier to read.
Upvotes: 3
Reputation: 26993
++myInt will add one to myInt before executing the line in question, myInt++ will do it afterward.
Examples:
int myInt;
myInt = 1;
someFunction(++myInt); // Sends 2 as the parameter
myInt = 1;
someFunction(myInt++); // Sends 1 as the parameter
Upvotes: 2
Reputation: 1502556
Others have shown where it makes a difference, and have commented that as a single statement it doesn't make a difference.
I'd like to add that it's almost always a bad idea to use it where it makes a difference. I suspect there may be some times where it's more readable to have code such as:
Console.WriteLine("Foo: {0}", foo++);
than:
Console.WriteLine("Foo: {0}", foo);
foo++;
... but they're very rare! The latter of these two samples makes the ordering crystal clear immediately - the former requires a bit of thinking (to my poor brain, anyway). Think of the readability first.
Upvotes: 11
Reputation: 14048
It doesn't unless it is in an expression, i.e.
myInt=1;
x=myInt++;
is different to:
myInt=1;
x=++myInt;
The first assigns 1 to x, because the assignment happens before the increment.
The second assigns 2 to x, because the assignment happens after the increment.
Upvotes: 9
Reputation: 103760
If for example you do something like this:
int myInt = 5;
Foo(++myInt);
void Foo(int x)
{
Console.WriteLine(x);
}
This will print out 6.
Foo(myInt++);
will print out 5;
Basically, ++myInt increments FIRST uses the variable SECOND. myInt++ is the opposite.
Upvotes: 0
Reputation: 15513
It is a difference if you are doing
int x = 7;
int x2 = x++;
=> x2 is 7 and x is 8
but when doing
int x = 7;
int x2 = ++x;
=> x2 is 8 and x is 8
Upvotes: 3