In C# programs int
values are incremented in several ways. Some options include the pre-increment and post-increment operators. We can also decrement.
There are subtle issues related to the order of evaluation. And performance can be affected by how we specify these operations.
Here we increment int
variables in different ways. The program shows both the ++ operator (with 2 pluses) and the += operator (with a plus and an equals).
using System; int i = 0; Console.WriteLine(i); // Part 1: post-increment. i++; Console.WriteLine(i); // Part 2: use constant in increment. i += 2; Console.WriteLine(i); // Part 3: use pre-increment. ++i; Console.WriteLine(i); // Part 4: increment with a variable. i += i; Console.WriteLine(i); // Part 5: use increment and assignment. int v = 0; v = i++; Console.WriteLine(v); Console.WriteLine(i); v = ++i; Console.WriteLine(v); Console.WriteLine(i);0 1 3 4 8 8 9 10 10
You should be familiar with the "++" and "minus minus" operators. This example uses the 2 pluses at the end of the variable identifier to increment the integer.
class Program { static int _x; static void Main() { // Add one. _x++; // Read in the value again. int count = _x; } }
We can pre-increment an integer. There are cases when accessing an integer is relatively slow. This can be the case with static
variables and volatile member ints.
class Program { static int _x; static void Main() { // Increment then assign. int count = ++_x; } }
We can optimize increments by loading the value in the same expression. If we use 2 statements, the static
variable must be accessed twice.
static
int
. Memory is accessed twice.using System; using System.Diagnostics; class Program { static int _test; const int _max = 100000000; static void Main() { _test = 0; var s1 = Stopwatch.StartNew(); // Version 1: increment then load. for (int i = 0; i < _max; i++) { _test++; int z = _test; if (z == 0) { return; } } s1.Stop(); _test = 0; // Version 2: increment and load in same expression. var s2 = Stopwatch.StartNew(); for (int i = 0; i < _max; i++) { int z = ++_test; if (z == 0) { return; } } s2.Stop(); Console.WriteLine(((double)(s1.Elapsed.TotalMilliseconds * 1000000) / _max).ToString("0.00 ns")); Console.WriteLine(((double)(s2.Elapsed.TotalMilliseconds * 1000000) / _max).ToString("0.00 ns")); } }1.49 ns increment, then load 1.31 ns preincrement and load in single statement
This reduces the value of a number. The decrement operator receives one or two operands. It is written with the characters "minus minus."
using System; int i = 100; // Decrement by one. i--; Console.WriteLine(i); // Decrement by two. i -= 2; Console.WriteLine(i); // Decrement by negative one (add one). i -= -1; Console.WriteLine(i); // Decrement by zero (do nothing). i -= 0; Console.WriteLine(i); // Decrement by itself (results in zero). i -= i; Console.WriteLine(i);99 97 98 98 0
There are 2 forms of the decrement by one operator: post-decrement and pre-decrement. These forms are unary operators—they can only receive one operand.
using System; int i = 5; // This evaluates to true. // ... The decrement occurs after the comparison. if (i-- == 5) { Console.WriteLine(true); } // This evaluates to true. // ... The decrement occurs before the comparison. if (--i == 3) { Console.WriteLine(true); }True True
For
-loops often have an increment statement. The value of the integer is modified after each successful iteration through the loop (not before).
Int
variables (numeric value types) can be incremented using a variety of syntaxes in C#. Pre-increment and post-increment operations are evaluated in different orders.