== Why is this an issue?

When using the https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/operators/arithmetic-operators#postfix-increment-operator[postfix increment] operator, it is important to know that the result of the expression `x++` is the value **before** the operation `x`.

This means that in some cases, the result might not be what you expect:

* When assigning `x++` to `x`, it's the same as assigning `x` to itself, since the value is assigned before the increment takes place
* When returning `x++`, the returning value is `x`, not `x+1`

The same applies to the postfix and prefix https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/operators/arithmetic-operators#decrement-operator---[decrement] operators.

== How to fix it

To solve the issue in assignments, eliminate the assignment, since `x\++` mutates `x` anyways. 

To solve the issue in return statements, consider using the https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/operators/arithmetic-operators#prefix-increment-operator[prefix increment] operator, since it works in reverse: the result of the expression `++x` is the value **after** the operation, which is `x+1`, as one might expect.

The same applies to the postfix and prefix https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/operators/arithmetic-operators#decrement-operator---[decrement] operators.

=== Code examples

==== Noncompliant code example

[source,csharp,diff-id=1,diff-type=noncompliant]
----
int PickNumber()
{
  int i = 0;
  int j = 0;

  i = i++;      // Noncompliant: i is still 0 
  return j--;   // Noncompliant: returns 0 
}
----

==== Compliant solution

[source,csharp,diff-id=1,diff-type=compliant]
----
int PickNumber()
{
  int i = 0;
  int j = 0;

  i++;          // Compliant: i is incremented to 1
  return --j;   // Compliant: returns -1
}
----

== Resources

=== Documentation

* Microsoft Learn - https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/operators/arithmetic-operators[Arithmetic operators (C# reference)]

=== Articles & blog posts

* StackOverflow - https://stackoverflow.com/a/3346729["What is the difference between i++ and ++i in C#?" - Eric Lippert's answer]


ifdef::env-github,rspecator-view[]

'''
== Implementation Specification
(visible only on this page)

include::../message.adoc[]

'''
== Comments And Links
(visible only on this page)

include::../comments-and-links.adoc[]

endif::env-github,rspecator-view[]
