An expression is a sequence of operators and operands that specifies a computation. C# has unary operators, binary operators, and one ternary operator. Complex expressions can be built because an operand may itself be an expression, such as the operand (1 + 2) in the following example:
((1 + 2) / 3)
When an expression contains multiple operators, the precedence of the operators controls the order in which the individual operators are evaluated. When the operators are of the same precedence, their associativity determines their order of evaluation. Binary operators (except for assignment operators) are left-associative and are evaluated from left to right. The assignment operators, unary operators, and the conditional operator are right-associative , evaluated from right to left.
For example:
1 + 2 + 3 * 4
is evaluated as:
((1 + 2) +(3 * 4))
because * has a higher precedence than +, and + is a left-associative binary operator. You can insert brackets to change the default order of evaluation. C# also overloads operators, which means the same operator symbols can have different meanings in different contexts (e.g., primary, unary, etc.) or different meanings for different types.
Table 2.2 lists C#’s operators in order of precedence. Operators in the same box have the same precedence, and operators in italic may be overloaded for custom types (see Section 2.9.8).
Table 2-2. Operator Precedence Table
Category |
Operators | |||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Primary |
| |||||||||||||
Unary |
| |||||||||||||
Multiplicative |
| |||||||||||||
Additive |
| |||||||||||||
Shift |
| |||||||||||||
Relational |
| |||||||||||||
Equality |
| |||||||||||||
Logical bitwise |
| |||||||||||||
Logical Boolean |
| |||||||||||||
Assignment |
Assign/modify: |
Checked/unchecked operators:
checked (expression ) |
unchecked (expression ) |
Checked/unchecked statements:
checked
statement-or-statement-block
|
unchecked
statement-or-statement-block
|
The checked
operator tells the runtime to generate
an OverflowException
if an integral expression
exceeds the arithmetic limits of that type. The
checked
operator affects expressions with the
++
, --
,
(unary)-
, +,
-
, *
, /
, and
explicit conversion operators ( ) between integral types (see Section 2.2.5.1). Here’s an
example:
int a = 1000000; int b = 1000000; // Check an expression int c = checked(a*b); // Check every expression in a statement-block checked { ... c = a * b; ... }
The checked
operator applies only to runtime
expressions, because constant expressions are checked during
compilation (though this can be turned off with the
/checked [+|-]
command-line compiler
switch). The unchecked
operator disables
arithmetic checking at compile time and is seldom useful, but it can
enable expressions such as this to compile:
const int signedBit = unchecked((int)0x80000000);
3.147.28.9