In order to perform different kinds of operations, C uses different kinds of operators. An operator indicates an operation to be performed on data that yields a value. Using various operators in C one link the variables and constants. An operand is a data item on which operators perform the operations. C is rich in the use of different operators. C provides four classes of operators. They are 1) Arithmetic 2) Relational 3) Logical 4) Bitwise. Apart from these basic operators, C also supports additional operators.
3.1 Types of operators
Type of Operator Symbolic Representation
Arithmetic operators + , -, *, / and %
Relational operators >,<,= =,>=.<= and !=
Logical operators &&, II and !
Increment and decrement operator ++ and —
Assignment operator =
Bitwise operators &,I,”,»,«and –
Comma operator ,
Conditional operator ? :
3.2 PRIORITY OF OPERATORS AND THEIR CLUBBING
Various relational operators have different priorities or precedence. If an arithmetic expression contains more operators then the execution will be performed according to their priorities. The precedence is set for different operators in C.
List of operators with priority wise (hierarchical) are shown in Table 3.2.
Table 3.2 List of operators with priority wise
Operators Operation Clubbing Priority
. Function call
Array expression or square bracket
Structure Operator Left to right 1st
type Unary plus
Size of an object
Type cast Right to Left 2nd
Modular division Left to Right 3rd
Subtraction Left to Right 4th
>> Left shift
Right Shift Left to Right 5th
>= Less than
Less than or equal to
Greater than or equal to Left to Right 6th
Inequality Left to Right 7th
& Bitwise AND Left to Right 8th
^ Bitwise XOR Left to Right 9th
| Bitwise OR Left to Right 10th
&& Logical AND Left to Right 11th
|| Logical OR Left to Right 12th
? : Conditional operator Right to Left 13th
=,*=,-=, &=,+=,^=, |=,<<=, >>= Assignment operator Right to Left 14th
, Comma operator Left to Right 15th
1) When two operators of the same priority are found in the expression, precedence is given to the extreme left operator.
3.3 COMMA AND CONDITIONAL OPERATOR
1) Comma operator (,) The comma operator is used to separate two or more expressions. The comma operator has the lowest priority among all the operators. It is not essential to enclose the expressions with comma operators within the parenthesis. For example the statements given below are valid.
2) Conditional operator (?) The conditional operator contains a condition followed by two statements or values. If the condition is true the first statement is executed otherwise the second statement.
The conditional operator (?) and (:) are sometimes called ternary operators because they take three arguments. The syntax of conditional operator is as given below.
Condition? (expression1): (expression2);
Two expressions are separated by a colon. If the condition is true expression1 gets evaluated otherwise expression 2. The condition is always written before? Mark.
3.4 ARITHMETIC OPERATORS
There are two types of arithmetic operators. They are 1) Binary Operator and 2) Unary Operator
a) Binary operator Table 3.3 shows different arithmetic operators that are used in ‘C’. These operators are commonly used in most of the computer languages. These arithmetic operators are used for numerical calculations between the two constant values. They are also called as Binary Arithmetic Operators. The examples are also shown in the Table 3.3 In the program variables are declared instead of constants.
Table 3.3 Arithmetic operators
Arithmetic Operators Operator Explanation Examples
+ Addition 2+2=4
– Subtraction 5-3=2
* Multiplication 2*5=10
/ Division 10/2=5
% Modular Division 11%3=2 (Remainder 2)
b) Unary Operators Unary operators are increment operator (++), decrement (- -) and minus (-) . These operators and their descriptions are given in the Table 3.4.
Table 3.4 Unary arithmetic operators
Operator Description or Action
& Address Operator
Size of Gives the size of variable
a) Minus (-) Unary minus is used to indicate or change the algebraic sign of a value.
b) Increment (++) & Decrement (–) Operators The C compilers produce very fast efficient object codes for increment and decrement operations. This code is better than generated by using the equivalent assignment statement. So, increment and decrement operators should be used whenever possible. •
The operator ++ adds one to its operand. Whereas the operator – – subtracts one from its operand. For justification x=x+1 can be written as x++; and x=x-1; can be written as x–;. Both these operators may either follow or precede the operand. That is, x=x+ 1; can be represented as x++; 01 ++x;
If ++ or – are used as a suffix to the variables name then the post increased / decreased operations take place. Consider an example for understanding ++ operator as a suffix to the variable.
In the above equation the current value of y is used for the product. The result is 200, which is assigned to ‘z’. After multiplication, the value of y is increased by one.
If “++” or “-“are used as a prefix to the variable name then pre increment/ decrement operations take place. Consider an example for understanding “++” operator as a prefix to the variable.
In the above equation the value of y is increased and then used for multiplication. The result is 220, which is assigned to ‘z’.
The following programs can be executed for verification of increment and decrement operations.
c) Size of 0 and ‘&’ Operator The size of ( ) operator gives the bytes occupied by a variable. The number of bytes occupied varies from variable to variable depending upon its dab types.
The ‘&’ operator prints address of the variable in the memory. The example given below illustrates the use of both the operators.
3.5 RELATIONAL OPERATORS
These operators are used to distinguish between two values depending on their relations. These operators provide the relationship between the two expressions. If the relation is true then it returns a value 1 otherwise 0 for false relation. The relational operators together with their descriptions, example and return value are described in Table 3.5.
Table 3.5 Relational Operator
Operators Description or Action Example Return Value
> Greater than 5>4 1
< Less than 10<9 0
<= Less than or equal to 10<=10 1
>= Greater than equal to 11>=5 1
= = Equal to 2==3 0
! = Not equal to 3!=3 0
The relational operator’s symbols are easy to understand. They are self-explanatory. However readers benefit a program is illustrated below.
3.6 LOGICAL OPERATORS
The logical relationship between the two expressions are checked with logical operators. Using these operators two expressions can be joined. After checking the conditions it provides logical true (1) or false (0) status. The operands could be constants, variables, and expressions. The Table 3.6 describes the three logical operators together with examples and their return values.
Table 3.6 Logical Operators
Operator Description or Action Example Return Value
&& Logical AND 5>3 && 5<10 1
|| Logical OR 8>5 || 8<2 1
! Logical NOT 8 ! = 8 0
From the above table following rules can be followed for logical operators.
1) The logical AND (& &) operator provides true result when both expressions are true otherwise 0.
2) The logical OR (I I) operator provides true result when one of the expressions is true otherwise 0.
3) The logical NOT operator (!) provides 0 if the condition is true otherwise 1.
3.7 BITWISE OPERATORS
C supports a set of bitwise operators as listed in the Table 3.7. C supports six bit operators. These operators can operate only on integer operands such as int, char, short, long int etc.
Table 3.7 Bitwise operators
>> Right shift
<< Left shift
^ Bitwise xor (Exclusive OR)
~ One’s complement
& Bitwise AND
| Bitwise OR
You have now studied the various operators such as arithmetic, logical and relational which are essential to write and execute programs. The precedence of the operators in the arithmetic operations furnished in the form of a table. The conditional & comma operators and programs on them, also described in this chapter. You are made aware of the logical operators OR, AND and NOT. Full descriptions on bit wise operators have been illustrated. Numerous Simple examples have been provided to the users to understand the various operators. The reader is expected to write more programs on this chapter.
Answer the following questions.
1. Explain different types of operators available in C?
2. What are the uses of comma (,) and conditional (?) operators?
3. What are Unary operators and their uses?
4. Describe logical operators with their return values?
5. Distinguish between logical and bitwise operators.
6. What are the relational operators?
7. What is the difference between ‘=’ and ‘= = ‘?
8. What are the symbols used for a) OR b) AND c) XOR d) NOT operations?
9. Explain the precedence of operators in arithmetic operations?
10. List the operators from higher priority to least priority?
11. What is the difference between %f and %g?
12. What is the difference between division and modular division operations?
13. What are the ASCII codes? List the codes for digits 1 to 9, A to Z and a to z.
We have already seen that individual constants, variables, array elements and function references joined together by various operators to form expressions. We have also mentioned that C includes a number of operators which fall into several different categories. In this chapter we examine certain of categories in detail. Specifically, we will see how arithmetic operators, unary operators, relational and logical operators, assignment operators and the conditional operator are used to form expressions.
The data items that operators act upon are called operands. Some operators require two operands, while others act upon only one operand. Most operators allow the individual operands to be expressions. A few operator permit only single variables as operands (more about this later).
3.1 ARITHMETIC OPERATORS
There are five arithmetic operators in C. They are
% remainder after integer division
The %operator is sometimes referred to as the modulus operator.
There is no exponentiation operator in C. However, there is a library function (pow) to carry out exponentiation (see Sec.3.6).
The operands acted upon by arithmetic operators must represent numeric values. Thus, the operands can be integer quantities, floating-point quantities or characters (remember -that character constants represent integer values, as determined by the computer’s character set). The remainder operator (%) requires that both operands be integers and the second operand be nonzero. Similarly, the division operator (I) requires that the second operand be nonzero.
Division of one integer quantity by another is referred to as integer division. This operation always results in a truncated quotient (i.e., the decimal portion of the quotient will be dropped). On the other hand if a division operation is carried out with two floating-point numbers, or with one floating-point number and one integer, the result will be a floating-point quotient.
Operands that differ in type may undergo type conversion before the expression takes on its final value. In general, the final result will be expressed in the highest precision possible, consistent with the data types of the operands. The following rules apply when neither / operand is unsigned.
1. If both operands are floating-point types whose precisions differ (e.g., a float and a double), the lower precision operand will be converted to the precision of the other operand, and the result will be expressed in this higher precision. Thus, an operation between a float and a double will result in a double; a float and a long double will result in a long double; and a double and a long double will result in a long double. (Note: In some versions of C, all operands of type float are automatically converted to double.)
2. If one operand is a floating-point type (e.g., float, double or long double) and the other is a char or an int (including short int or long int), the char or int will be converted to the floating-point type and the result will be expressed as such. Hence, an operation between an int and a double will result in a double.
3. If neither operand is a floating-point type but one is a long int, the other will be converted to long int and the result will be long into Thus, an operation between a long int and an int will result in a long int.
4. If neither operand is a floating-point type or a long int, then both operands will be converted to int (if necessary) and the result will be into Thus, an operation between a short int and an int will result in an int.
A detailed summary of these rules is given in Appendix D. Conversions involving unsigned operands are also explained in Appendix D.
3.2 UNARY OPERATORS
C includes a class of operators that act upon a single operand to produce a new value. Such operators are known as unary operators. Unary operators usually precede their single operands, though some unary operators are written after their operands.
Perhaps the most common unary operation is unary minus, where a numerical constant, variable or expression is preceded by a minus sign. (Some programming languages allow a minus sign to be included as a part of a numeric constant. In C, however, all numeric constants are positive. Thus, a negative number is actually an expression, consisting of the unary minus operator, followed by a positive numeric constant.)
Note that the unary minus operation is distinctly different from the arithmetic operator which denotes subtraction (-). The subtraction operator requires two separate-operands.
3.3 RELATIONALAND LOGICAL OPERATORS
There are four relational operators in C. They are
< less than
<= less than or equal to
> greater than
>= greater than or equal to
These operators all fall within the same precedence group, which is lower than the arithmetic and unary operators. The associatively of these operators is left to right.
Closely associated with the relational operators are the following two equality operators.
== equal to
!= not equal to
The equality operators fall into a separate precedence group, beneath the relational operators. These operators also have a left-to-right associatively.
These six operators are used to form logical expressions, which represent conditions that are either true or false. The resulting expressions will be of type integer, since true is represented by the integer value 1 and false is represented by the value 0.
3.4 ASSIGNMENT OPERATORS
There are several different assignment operators in C. All of them are used to form assignment .expressions which assign the value of an expression to an identifier.
The most commonly used assignment operator is = Assignment expressions that make use of this operator are written in the form
identifier = expression
where identifier generally represents a variable, and expression represents a constant, a variable or a more complex expression.
Remember that the assignment operator = and the equality operator == are distinctly different. The assignment operator is used to assign a value to an identifier, whereas the equality operator is used to determine if two expressions have the same value. These operators cannot be used in place of one another.
Beginning programmers often incorrectly use the assignment operator when they want to test for equality. This results in a logical error that is usually difficult to detect.
Assignment expressions are often referred to as assignment statements, since they are usually written as complete statements. However, assignment expressions can also be written as expressions that are included within other statements (more about this in later chapters).
If the two operands in an assignment expression are of different data types, then the value of the expression on the right (i.e., the right-hand operand) will automatically be converted to the type of the identifier on the left. The entire assignment expression will then be of this same data type.
Under some circumstances this automatic type conversion can result in an alteration of the data being assigned. For example:
A floating-point value may be truncated if assigned to an integer identifier.
A double-precision value may be rounded if assigned to a floating-point (single-precision) identifier.
An integer quantity may be altered if assigned to a shorter integer identifier or to a character identifier (some high-order bits may be lost).
Moreover the value of a character constant assigned to a numeric-type identifier will be dependent upon the particular character set in use. This may result in inconsistencies from one version of C to another.
The careless use of type conversions is a frequent source of error among beginning programmers.
THE CONDITIONAL OPERATOR
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 can be written in place of the more traditional if -else statement, which is discussed in Chap.6.
A condition expression is written in the form
expression 1 ? expression 2 : expression 3
When evaluating a conditional expression, expression 1 is evaluated first. If expression 1 is true (i.e., if, its value is nonzero), then expression 2 is evaluated and this becomes the value of the conditional expression. However, if expression 1 is false (i.e., if its value is zero),then expression 3 is evaluated and this becomes the value of the conditional expression. Note that only one of the embedded expressions (either expression 2 or expression 3) is evaluated when determining the value of a conditional expression.
The C language is accompanied by a number of library functions that carry out various commonly used operations or calculations. These library functions are not a part of the language per se, though all implementations of the language include them. Some functions return a data item to their access point; others indicate whether a condition is true or false by returning a 1 or a 0, respectively; still others carry out specific operations on data items but do not return anything. Features which tend to be computer-dependent are generally written as library functions.
For example, there are library functions that carry out standard input/output operations (e.g., read and write characters, read and write numbers, open and close files, test for end of file, etc.), functions that perform operations on characters (e.g., convert from lower- to uppercase, test to see if a character is uppercase, etc.), and function that perform operations on strings (e.g., copy a string, compare strings, concatenate strings, etc.), and functions that carry out various mathematical calculations (e.g., evaluate trigonometric, logarithmic and exponential functions, compute absolute values, square roots, etc.). Other kinds of library functions are also available.
Library functions that are functionally similar are usually grouped together as (compiled) object programs in separate library files. These library files are supplied as a part of each C compiler. All C compilers contain similar groups of library functions, though they lack precise standardization. Thus there may be some variation in the library functions that are available in different versions of the language.
A typical set of library functions will include a fairly large number of functions that are common to most C compilers such as those shown in Table 3-2 below. Within this table, the column labeled “type” refers to the data type of the quantity that is returned by the function. The void entry shown for function srand indicates that nothing is returned by this function.
A more extensive list, which includes all of the library functions that appear in the programming examples presented in this book, is shown in Appendix H. For complete list, see the programmer’s reference manual that accompanies your particular version of C.
A library function is accessed simply by writing the function name, followed by a list of arguments that represent information being passed to the function. The arguments must be enclosed in parentheses and separated by commas. The arguments can be constants, variable names, or more complex expressions. The
parentheses must be present, even if there are no arguments.
A function that returns a data item can appear anywhere within an expression, in place of a constant or an identifier(i.e., in place of a variable or an array element). A function that carries out operations on data items but does not return anything can be accessed simply by writing the function name, since this type of function reference constitutes an expression statement.
Table 3-2 Some Commonly Used Library Functions
Function Type Purpose
abs(i) Int Return the absolute value of i.
ceil(d) double Round up to the next integer value (the smallest integer that is greater than or equal to d).
cos(d) double Return the cosine of d.
cosh (d) double Return the hyperbolic cosine of d.
exp (d) double Raise e to the power d (e =2.7182818. .. is the base of the natural (Naperian) system of logarithms).
fabs (d) double Return the absolute value of d.
floor (d) double Round down to the next integer value (the largest integer that does not exceed d).
fmod (d1,d2) double Return the remainder (i.e., the noninteger part of the quotient) of d1/d2, with same sign as d1.
getchar () int Enter a character from the standard input device.
log (d) double Return the natural logarithm of d.
pow (d1,d2) double Return d1 raised to the d2 power.
printf(…) int Send data items to the standard output device (arguments are complicated see Chap. 4).
pitcher © int Send a character to the standard output device
rand ( ) int Return a random positive integer.
sin (d) double Return the sine of d.
sqrt (d) double Return the square root of d.
srand (u) void Initialize the random number generator.
scanf(…) int Enter data items from the standard input device (arguments are complicated see Chap. 4).
tan (d) double Return the tangent of d.
toascii © int Convert value of argument to ASCII.
tolower © int Convert letter to lowercase
toupper © int Convert letter to uppercase.
Type refers to the data type of the quantity that is returned by the function.
c denotes a character-type argument
i denotes an integer argument
d denotes a double-precision argument
u denotes an unsigned integer argument
1. What is an expression? What are its components?
2. What is an operator? Describe several different types of operators that are included in C.
3. What is an operand? What is the relationship between operators and operands?
4. Describe the five arithmetic operators in C. Summarize the rules associated with their use.
5. Summarize the rules that apply to expressions whose operands are of different types.
6. How can the value of an expression be converted to a different data type? What is this called?
7. What is meant by operator precedence? What are the relative precedence’s of the arithmetic operators?
8. What is meant by associativity? What is the associativity of the arithmetic operators?
9. When should parentheses be included within an expression? When should the use of parentheses be avoided.
10. In what order are the operations carried out within an expression that contains nested parentheses?
11. What are unary operators? How many operands are associated with a unary operator?
12. Describe the six unary operators discussed in this chapter. What is the purpose of each?
13. Describe two different ways to utilize the increment and decrement operators. How do the two method differ?
14. What is the relative precedence of the unary operators compared with the arithmetic operators? What is their associativity?
15. How can the number of bytes allocated to each data type be determined for a particular C compiler?
16. Describe the four relational operators included in C. With what type of operands can they be used? What type of expression is obtained?
17. Describe the two equality operators included in C. How do they differ from the relational operators?
18. Describe the two logical operators included in C. What is the purpose of each? With what type of operands can they be used? What type of expression is obtained?
19. What are the relative precedence’s of the relational, equality and logical operators with respect to one another and with respect to the arithmetic and unary operators? What are their associativities?
20. Describe the logical not (logical negation) operator. What is its purpose? Within which precedence group is it included? How many operands does it require? What is its associativity?
21. Describe the six assignment operators discussed in this chapter. What is the purpose of each?
22. How is the type of an assignment expression determined when the two operands are of different data types? In what sense is this situation sometimes a source of programming errors?
23. How can multiple assignments be written in C? In what order will the assignments be carried out?
24. What is the precedence of assignment operators relative to other operators? What is their associativity?
25. Describe the use of the conditional operator to form conditional expressions. How is a conditional expression evaluated?
26. How is the type of a conditional expression determined when its operands differ in type?
27. How can the conditional operator be combined with the assignment operator to form an “if -else” type statement?
28. What is the precedence of the conditional operator relative to the other operators described in this chapter? What is its associativity?
29. Describe, in general terms, the kinds of operations and calculations that are carried out by the C library functions.
30. Are the library functions actually a part of the C language? Explain.
31. How are the library functions usually packaged within a C compiler?
32. How are library functions accessed? How is information passed to a library function from the access point?
33. What are arguments? How are arguments written? How is a call to a library function written if there are no arguments?
34. How is specific information that may be required by the library functions stored? How is this information entered into a C program?
35. In what general category do the #define and #include statements fall?
C supports a rich set of operators. We have already used several of them, such as =, +. -, *, & and, <.An operator is a symbol that tells the computer to perform certain mathematical or logical manipulations. Operators are used in programs to manipulate data and variables. They usually form a part of the mathematical of logical expressions.
C operators can be classified into a number of categories. They include:
1. Arithmetic operators.
2. Relational operators.
3. Logical operators.
4. Assignment operators.
5. Incrementand decrement operators.
6. Conditional operators.
3.2 ARITHMETIC OPERATORS
C provides all the basic arithmetic operators. They are listed in Table 3.1. The operators +, -, * and I all work the same way as they do in other languages. These can operate on any built-in data type allowed in C. The unary minus operator, in effect, multiplies its single operand by -1. Therefore, a number preceded by a minus sign changes its sign.
Table 3.1 Arithmetic Operators
+ Addition or unary plus
– Subtraction or unary minus
% Modulo division
Integer division truncates any fractional part. The modulo division produces the remainder of an integer division. Examples of arithmetic operators are:
a – b a + b
a * b a / b
a % b -a * b
Here a and b are variables and are known as operands. The modulo division operator % cannot be used on floating point data.
Note that C does not have an operator for exponentiation. Older versions of C does not support unary plus but ANSI C supports it.
When both the operands in a single arithmetic expression such as a+b are integers, the expression is called an integer expression, and the operation is called integer arithmetic. Integer arithmetical ways yields an integer value. The largest integer value depends on the machine, as pointed out earlier. In the above examples, if a and b are integers, then for a = 14 and b = 4 we have the following results:
a – b = 10
a + b = 18
a / b = 3 (decimal part truncated)
a % b = 2 (remainder of division)
During integer division, if both the operands are of the same sign, the result is truncated towards zero. If one of them is negative, the direction of truncation is implementation dependent. That is,
6/7 = 0 and -6/-7 = 0
but -6/7 may be zero or -1. (Machine dependent)
Similarly, during modulo division, the sign of the result is always the sign of the first operand (the dividend.) That is
-14 % 3 = -2
-14 % -3 = -2
14 % -3 = 2
An arithmetic operation involving only real operands is called eal arithmetic. A real operand may assume values either in decimal or exponential notation. Since floating point values are rou