Operators
As we have seen, general expressions are formed by joining together constants and variables via various operators. Operators in C fall into five main classes: arithmetic operators, unary operators, relational and logical operators, assignment operators, and the conditional operator. Let us, now, examine each of these classes in detail.
There are four main arithmetic operators in C. These are:
addition +
subtraction -
multiplication *
division /
Unbelievably, there is no built-in exponentiation operator in C (C was written by computer scientists)! Instead, there is a library function (pow) which carries out this operation (see later).It is poor programming practice to mix types in arithmetic expressions. In other words, the two operands operated on by the addition, subtraction, multiplication, or division operators should both be either of type int or type double. The value of an expression can be converted to a different data type by prepending the name of the desired data type, enclosed in parenthesis. This type of construction is known as a cast. Thus, to convert an integer variable j into a floating-point variable with the same value, we would write
(double) j
Finally, to avoid mixing data types when dividing a floating-point variable x by an integer variable i, we would writex / (double) i
Of course, the result of this operation would be of type double.The operators within C are grouped hierarchically according to their precedence (i.e., their order of evaluation). Amongst the arithmetic operators,
*
and /
have precedence over +
and -
. In other words, when evaluating expressions, C performs multiplication and division operations prior to addition and subtraction operations. Of course, the rules of precedence can always be bypassed by judicious use of parentheses. Thus, the expressiona - b / c + d
is equivalent to the unambiguous expressiona - (b / c) + d
since division takes precedence over addition and subtraction.The distinguishing feature of unary operators is that they only act on single operands. The most common unary operator is the unary minus, which occurs when a numerical constant, variable, or expression is preceded by a minus sign. Note that the unary minus is distinctly different from the arithmetic operator (
-
) which denotes subtraction, since the latter operator acts on two separate operands. The two other common unary operators are the increment operator, ++
, and the decrement operator, --
. The increment operator causes its operand to be increased by1, whereas the decrement operator causes its operand to be decreased by 1. For example, -i is equivalent to i = i - 1. A cast is also considered to be a unary operator. Note that unary operators have precedence over arithmetic operators. Hence, - x + y
is equivalent to the unambiguous expression (-x) + y
, since the unary minus operator has precedence over the addition operator.Note that there is a subtle distinction between the expressions
a++
and ++a
. In the former case, the value of the variable a
is returned before it is incremented. In the latter case, the value of a
is returned after incrementation. Thus,b = a++;
is equivalent tob = a;
a = a + 1;
whereasb = ++a;
is equivalent toa = a + 1;
b = a;
There is a similar distinction between the expressions a--
and --a
.There are four relational operators in C. These are:
less than <
less than or equal to <=
greater than >
greater than or equal to >=
The precedence of these operators is lower than that of arithmetic operators.Closely associated with the relational operators are the two equality operators:
equal to ==
not equal to !=
The precedence of the equality operators is below that of the relational operators.The relational and equality operators are used to form logical expressions, which represent conditions that are either true or false. The resulting expressions are of type int, since true is represented by the integer value 1 and false by the integer value 0. For example, the expression i < j is true (value 1) if the value of i is less than the value of j, and false (value 0) otherwise. Likewise, the expression j == 3 is true if the value of j is equal to 3, and false otherwise.
C also possess two logical operators. These are:
&& and
|| or
The logical operators act on operands which are themselves logical expressions. The net effect is to combine the individual logical expressions into more complex expressions that are either true or false. The result of a logical and operation is only true if both operands are true, whereas the result of a logical or operation is only false if both operands are false. For instance, the expression (i >= 5) &&
(j == 3) is true if the value of i is greater than or equal to 5 and the value of j is equal to 3, otherwise it is false. The precedence of the logical and operator is higher than that of the logical or operator, but lower than that of the equality operators.C also includes the unary operator
!
that negates the value of a logical expression: i.e., it causes an expression that is originally true to become false, and vice versa. This operator is referred to as the logical negation or logical not operator. For instance, the expression !(k == 4)
is true if the value of k is not equal to 4, and false otherwise.Note that it is poor programming practice to rely too heavily on operator precedence, since such reliance tends to makes C programs very hard for other people to follow. For instance, instead of writing
i + j == 3 && i * l >= 5
and relying on the fact that arithmetic operators have precedence over relational and equality operators, which, in turn, have precedence over logical operators, it is better to write((i + j) == 3) && (i * l >= 5)
whose meaning is fairly unambiguous, even to people who cannot remember the order of precedence of the various operators in C.The most common assignment operator in C is
=
. For instance, the expressionf = 3.4
causes the floating-point value 3.4 to be assigned to the variable f. Note that the assignment operator =
and the equality operator ==
perform completely different functions in C, and should not be confused. Multiple assignments are permissible in C. For example,i = j = k = 4
causes the integer value 4 to be assigned to i, j, and k, simultaneously. Note, again, that it is poor programming practice to mix data types in assignment expressions. Thus, the data types of the constants or variables on either side of the =
sign should always match.C contains four additional assignment operators:
+=
, -=
, *=
, and /=
. The expressioni += 6
is equivalent to i = i + 6
. Likewise, the expressioni -= 6
is equivalent to i = i - 6
. The expressioni *= 6
is equivalent to i = i * 6
. Finally, the expressioni /= 6
is equivalent to i = i / 6
. Note that the precedence of assignment operators is below that of all the operators discussed previously.Simple conditional operations can be carried out with the conditional operator
(? :)
. An expression that makes use of the conditional operator is called a conditional expression. Such an expression takes the general formexpression 1 ? expression 2 : expression 3
If expression 1
is true (i.e., if its value is nonzero) then expression 2
is evaluated and becomes the value of the conditional expression. On the other hand, if expression 1
is false (i.e., if its value is zero) then expression 3
is evaluated and becomes the value of the conditional expression. For instance, the expression(j < 5) ? 12 : -6
takes the value 12 if the value of j is less than 5, and the value -6 otherwise. The assignment statementk = (i < 0) ? n : m
causes the value of n to be assigned to the variable k if the value of i is less than zero, and the value of m to be assigned to k otherwise. The precedence of the conditional operator is just above that of the assignment operators.As we have already mentioned, scientific programs tend to be extremely resource intensive. Scientific programmers should, therefore, always be on the lookout for methods of speeding up the execution of their codes. It is important to realize that multiplication (
*
) and division (/
) operations consume considerably more CPU time that addition (+
), subtraction (-
), comparison, or assignment operations. Thus, a simple rule of thumb for writing efficient code is to try to avoid redundant multiplication and division operations. This is particularly important for sections of code which are executed repeatedly: e.g., code which lies within control loops. The classic illustration of this point is the evaluation of a polynomial. The most straightforward method of evaluating (say) a fourth-order polynomial would be to write something like:p = c_0 + c_1 * x + c_2 * x * x + c_3 * x * x * x + c_4 * x * x * x * x
Note that the above expression employs ten expensive multiplication operations. However, this number can be reduced to four via a simple algebraic rearrangement:p = c_0 + x * (c_1 + x * (c_2 + x * (c_3 + x * c_4)))
Clearly, the latter expression is far more computationally efficient than the former.If Statements
The ability to control the flow of your program, letting it make decisions on what code to execute, is valuable to the programmer. The if statement allows you to control if a program enters a section of code or not based on whether a given condition is true or false. One of the important functions of the if statement is that it allows the program to select an action based upon the user's input. For example, by using an if statement to check a user-entered password, your program can decide whether a user is allowed access to the program.Without a conditional statement such as the if statement, programs would run almost the exact same way every time, always following the same sequence of function calls. If statements allow the flow of the program to be changed, which leads to more interesting code.
Before discussing the actual structure of the if statement, let us examine the meaning of TRUE and FALSE in computer terminology. A true statement is one that evaluates to a nonzero number. A false statement evaluates to zero. When you perform comparison with the relational operators, the operator will return 1 if the comparison is true, or 0 if the comparison is false. For example, the check 0 == 2 evaluates to 0. The check 2 == 2 evaluates to a 1. If this confuses you, try to use a printf statement to output the result of those various comparisons (for example printf ( "%d", 2 == 1 );)
When programming, the aim of the program will often require the checking of one value stored by a variable against another value to determine whether one is larger, smaller, or equal to the other.
There are a number of operators that allow these checks.
Here are the relational operators, as they are known, along with examples:
> greater than 5 > 4 is TRUE < less than 4 < 5 is TRUE >= greater than or equal 4 >= 4 is TRUE <= less than or equal 3 <= 4 is TRUE == equal to 5 == 5 is TRUE != not equal to 5 != 4 is TRUEIt is highly probable that you have seen these before, probably with slightly different symbols. They should not present any hindrance to understanding. Now that you understand TRUE and FALSE well as the comparison operators, let us look at the actual structure of if statements.
Basic If Syntax
The structure of an if statement is as follows:if ( statement is TRUE ) Execute this line of codeHere is a simple example that shows the syntax:
if ( 5 < 10 ) printf( "Five is now less than ten, that's a big surprise" );Here, we're just evaluating the statement, "is five less than ten", to see if it is true or not; with any luck, it is! If you want, you can write your own full program including stdio.h and put this in the main function and run it to test.
To have more than one statement execute after an if statement that evaluates to true, use braces, like we did with the body of the main function. Anything inside braces is called a compound statement, or a block. When using if statements, the code that depends on the if statement is called the "body" of the if statement.
For example:
if ( TRUE ) { /* between the braces is the body of the if statement */ Execute all statements inside the body }I recommend always putting braces following if statements. If you do this, you never have to remember to put them in when you want more than one statement to be executed, and you make the body of the if statement more visually clear.
Else
Sometimes when the condition in an if statement evaluates to false, it would be nice to execute some code instead of the code executed when the statement evaluates to true. The "else" statement effectively says that whatever code after it (whether a single line or code between brackets) is executed if the if statement is FALSE.It can look like this:
if ( TRUE ) {
/* Execute these statements if TRUE */
}
else {
/* Execute these statements if FALSE */
}
Else if
Another use of else is when there are multiple conditional statements that may all evaluate to true, yet you want only one if statement's body to execute. You can use an "else if" statement following an if statement and its body; that way, if the first statement is true, the "else if" will be ignored, but if the if statement is false, it will then check the condition for the else if statement. If the if statement was true the else statement will not be checked. It is possible to use numerous else if statements to ensure that only one block of code is executed.Let's look at a simple program for you to try out on your own.
#include <stdio.h>
int main() /* Most important part of the program! */
{
int age; /* Need a variable... */
printf( "Please enter your age" ); /* Asks for age */
scanf( "%d", &age ); /* The input is put in age */
if ( age < 100 ) { /* If the age is less than 100 */
printf ("You are pretty young!\n" ); /* Just to show you it works... */
}
else if ( age == 100 ) { /* I use else just to show an example */
printf( "You are old\n" );
}
else {
printf( "You are really old\n" );
}
return 0;
}
More interesting conditions using boolean operators
Boolean operators allow you to create more complex conditional statements. For example, if you wish to check if a variable is both greater than five and less than ten, you could use the Boolean AND to ensure both var > 5 and var < 10 are true. In the following discussion of Boolean operators, I will capitalize the Boolean operators in order to distinguish them from normal English. The actual C operators of equivalent function will be described further along into the tutorial - the C symbols are not: OR, AND, NOT, although they are of equivalent function.When using if statements, you will often wish to check multiple different conditions. You must understand the Boolean operators OR, NOT, and AND. The boolean operators function in a similar way to the comparison operators: each returns 0 if evaluates to FALSE or 1 if it evaluates to TRUE.
NOT: The NOT operator accepts one input. If that input is TRUE, it returns FALSE, and if that input is FALSE, it returns TRUE. For example, NOT (1) evaluates to 0, and NOT (0) evaluates to 1. NOT (any number but zero) evaluates to 0. In C NOT is written as !. NOT is evaluated prior to both AND and OR.
AND: This is another important command. AND returns TRUE if both inputs are TRUE (if 'this' AND 'that' are true). (1) AND (0) would evaluate to zero because one of the inputs is false (both must be TRUE for it to evaluate to TRUE). (1) AND (1) evaluates to 1. (any number but 0) AND (0) evaluates to 0. The AND operator is written && in C. Do not be confused by thinking it checks equality between numbers: it does not. Keep in mind that the AND operator is evaluated before the OR operator.
OR: Very useful is the OR statement! If either (or both) of the two values it checks are TRUE then it returns TRUE. For example, (1) OR (0) evaluates to 1. (0) OR (0) evaluates to 0. The OR is written as || in C. Those are the pipe characters. On your keyboard, they may look like a stretched colon. On my computer the pipe shares its key with \. Keep in mind that OR will be evaluated after AND.
It is possible to combine several Boolean operators in a single statement; often you will find doing so to be of great value when creating complex expressions for if statements. What is !(1 && 0)? Of course, it would be TRUE. It is true is because 1 && 0 evaluates to 0 and !0 evaluates to TRUE (i.e., 1).
Try some of these - they're not too hard. If you have questions about them, feel free to stop by our forums.
A. !( 1 || 0 ) ANSWER: 0 B. !( 1 || 1 && 0 ) ANSWER: 0 (AND is evaluated before OR) C. !( ( 1 || 0 ) && 0 ) ANSWER: 1 (Parenthesis are useful)If you find you enjoyed this section, then you might want to look more at Boolean Algebra.
Previous Page Next Page