Objective-C Operators and Expressions
In the previous chapters we looked at using variables and constants in Objective-C and also described the different data types. Being able to create variables is only part of the story however. The next step is to learn how to use these variables and constants in Objective-C code. The primary method for working with data is in the form of expressions. In this chapter we will look in detail at Objective-C expressions and operators.
What is an Expression?
The most basic expression consists of an operator, two operands and an assignment. The following is an example of an expression:
int myresult = 1 + 2;
In the above example the (+) operator is used to add two operands (1 and 2) together. The assignment operator (=) subsequently assigns the result of the addition to an integer variable named myresult. The operands could just have easily been variables (or a mixture of constants and variables) instead of the actual numerical values used in the example.
In the remainder of this chapter we will look at the various types of operators available in Objective-C.
The Basic Assignment Operator
We have already looked at the most basic of assignment operators, the = operator. This assignment operator simply assigns the result of an expression to a variable. In essence, the = assignment operator takes two operands. The left hand operand is the variable to which a value is to be assigned and the right hand operand is the value to be assigned. The right hand operand is, more often than not, an expression which performs some type of arithmetic or logical evaluation, the result of which will be assigned to the variable. The following examples are all valid uses of the assignment operator:
int x; // declare the variable x = 10; // Assigns the value 10 to a variable named x x = y + z; // Assigns the result of variable y added to variable z to variable x x = y; // Assigns the value of variable y to variable x
Assignment operators may also be chained to assign the same value to multiple variables. For example, the following code example assigns the value 20 to the x, y and z variables:
int x, y, z; x = y = z = 20;
Objective-C Arithmetic Operators
Objective-C provides a range of operators for the purpose of creating mathematical expressions. These operators primarily fall into the category of binary operators in that they take two operands. The exception is the unary negative operator (-) which serves to indicate that a value is negative rather than positive. This contrasts with the subtraction operator (-) which takes two operands (i.e. one value to be subtracted from another). For example:
int x = -10; // Unary - operator used to assign -10 to a variable named x x = y - z; // Subtraction operator. Subtracts z from y
<google>ADSDAQBOX_FLOW</google> The following table lists the primary Objective-C arithmetic operators:
Operator | Description |
---|---|
-(unary) | Negates the value of a variable or expression |
* | Multiplication |
/ | Division |
+ | Addition |
- | Subtraction |
% | Modulo |
Note that multiple operators may be used in a single expression.
For example:
x = y * 10 + z - 5 / 4;
Whilst the above code is perfectly valid it is important to be aware that Objective-C does not evaluate the expression from left to right or right to left, but rather in an order specified by the precedence of the various operators. Operator precedence is an important topic to understand since it impacts the result of a calculation and will be covered in detail the chapter entitled Objective-C 2.0 Operator Precedence.
Compound Assignment Operators
In an earlier section we looked at the basic assignment operator (=). Objective-C provides a number of operators designed to combine an assignment with a mathematical or logical operation. These are primarily of use when performing an evaluation where the result is to be stored in one of the operands. For example, one might write an expression as follows:
x = x + y;
The above expression adds the value contained in variable x to the value contained in variable y and stores the result in variable x. This can be simplified using the addition compound assignment operator:
x += y
The above expression performs exactly the same task as x = x + y but saves the programmer some typing.
Numerous compound assignment operators are available in Objective-C. The most frequently used are outlined in the following table:
Operator | Description |
---|---|
x += y | Add x to y and place result in x |
x -= y | Subtract y from x and place result in x |
x *= y | Multiply x by y and place result in x |
x /= y | Divide x by y and place result in x |
x %= y | Perform Modulo on x and y and place result in x |
x &= y | Assign to x the result of logical AND operation on x and y |
x |= y | Assign to x the result of logical OR operation on x and y |
x ^= y | Assign to x the result of logical Exclusive OR on x and y |
Increment and Decrement Operators
Another useful shortcut can be achieved using the Objective-C increment and decrement operators (also referred to as unary operators because they operate on a single operand). As with the compound assignment operators described in the previous section, consider the following Objective-C code fragment:
x = x + 1; // Increase value of variable x by 1 x = x - 1; // Decrease value of variable y by 1
These expressions increment and decrement the value of x by 1. Instead of using this approach it is quicker to use the ++ and -- operators. The following examples perform exactly the same tasks as the examples above:
x++; Increment x by 1 x--; Decrement x by 1
These operators can be placed either before or after the variable name. If the operator is placed before the variable name the increment or decrement is performed before any other operations are performed on the variable. For example, in the following example, x is incremented before it is assigned to y, leaving y with a value of 10:
int x = 9; int y; y = ++x;
In the following example, the value of x (9) is assigned to variable y before the decrement is performed. After the expression is evaluated the value of y will be 9 and the value of x will be 8.
int x = 9; int y; y = x--;
Comparison Operators
In addition to mathematical and assignment operators, C# also includes set of logical operators useful for performing comparisons. These operators all return a Boolean (bool) true or false result depending on the result of the comparison. These operators are binary in that they work with two operands.
Comparison operators are most frequently used in constructing program flow control. For example an if statement may be constructed based on whether one value matches another:
if (x == y) System.Console.WriteLine ("x is equal to y");
The result of a comparison may also be stored in a bool variable. For example, the following code will result in a true value being stored in the variable result:
bool result; int x = 10; int y = 20; result = x < y;
Clearly 10 is less than 20, resulting in a true evaluation of the x < y expression. The following table lists the full set of C# comparison operators:
Operator | Description |
---|---|
x == y | Returns true if x is equal to y |
x > y | Returns true if x is greater than y |
x >= y | Returns true if x is greater than or equal to y |
x < y | Returns true if x is less than y |
x <= y | Returns true if x is less than or equal to y |
x != y | Returns true if x is not equal to y |
Boolean Logical Operators
Objective-C also provides a set of so called logical operators designed to return boolean true and false. In practice true equates to 1 and false equates to 0. These operators both return boolean results and take boolean values as operands. The key operators are NOT (!), AND (&&), OR (||) and XOR (^).
The NOT (!) operator simply inverts the current value of a boolean variable, or the result of an expression. For example, if a variable named flag is currently 1 (true), prefixing the variable with a '!' character will invert the value to 0 (false):
bool flag = true; //variable is true bool secondFlag; secondFlag = !flag; // secondFlag set to false
The OR (||) operator returns 1 if one of its two operands evaluates to true, otherwise it returns 0. For example, the following example evaluates to true because at least one of the expressions either side of the OR operator is true:
if ((10 < 20) || (20 < 10)) NSLog (@"Expression is true");
The AND (&&) operator returns 1 only if both operands evaluate to be true. The following example will return 0 because only one of the two operand expressions evaluates to true:
if ((10 < 20) && (20 < 10)) NSLog (@"Expression is true");
The XOR (^) operator returns 1 if one and only one of the two operands evaluates to true. For example, the following example will return 1 since only one operator evaluates to be true:
if ((10 < 20) ^ (20 < 10)) System.Console.WriteLine("Expression is true");
If both operands evaluated to be true, or both were false the expression with return false.
The Ternary Operator
Objective-C uses something called a ternary operator to provide a shortcut way of making decisions. The syntax of the ternary operator (also known as the conditional operator) is as follows:
[condition] ? [true expression] : [false expression]
The way this works is that [condition] is replaced with an expression that will return either true (1) or false (0). If the result is true then the expression that replaces the [true expression] is evaluated. Conversely, if the result was false then the [false expression] is evaluated. Let's see this in action:
int x = 10; int y = 20; NSLog(@"Largest number is %i", x > y ? x : y );
The above code example will evaluate whether x is greater than y. Clearly this will evaluate to false resulting in y being returned to the NSLog call for display to the user:
2009-10-07 11:14:06.756 t[5724] Largest number is 20