A Complete Study Of Operators In C++ With Examples:
In this Intensive C++ Training Series, we learned about the various concepts in C++ like variables, storage classes, type qualifiers, etc in our earlier tutorials. We also came to know how we can modify these variables.
To do these modifications, we need to perform operations on these variables & constants and to perform these operations we make use of operators.
Operators are symbols which act on variables or other entities that are called operands and perform mathematical or logical operations to modify their values and produce results accordingly.
Operators In C++
Operators form the basic foundation of any programming language. Without operators, we cannot modify or manipulate the entities of programming languages and thereby cannot produce the desired results. C++ is very rich in built-in operators which we will discuss in detail in this tutorial.
In C++ most of the operators are binary operators i.e. these operators require two operands to perform an operation. Few operators like ++ (increment) operator are the unary operator which means they operate on one operand only.
There is also a ternary operator in C++ called Conditional Operator which takes three operands. We will learn about this in detail in the later part of the tutorial.
Types Of Operators In C++
Operators in C++ are classified as shown below:
Let’s Explore each type of C++ operator in detail!!
Arithmetic Operators
Arithmetic operators are used for performing basic mathematical operations on operands.
C++ supports the following arithmetic operations:
| Operator | Binary/unary | Description |
|---|---|---|
| + | Binary | Addition of two operands |
| - | Binary | Subtraction of two operands |
| * | Binary | Multiplication of two operands |
| / | Binary | Division of two operands |
| % | Binary | Modulus operator – the result is the remainder of the division |
| ++ | Unary | Increment operator – increases the value of operand by 1 |
| -- | Unary | Decrement operator – decreases the value of operand by 1 |
The below Example demonstrates the first five arithmetic operators in C++
#include <iostream>
#include <string>
using namespace std;
int main()
{
int op1=3,op2=4;
float op3=10.1,op4=5.4;
cout<<"Operands are op1 = "<<op1<<" op2 = "<<op2;
cout<<" op3 = "<<op3<<" op4 = "<<op4;
cout<<endl;
cout<<"op1 + op2 = "<<op1+op2<<endl;
cout<<"op1 - op2 = "<<op1-op2<<endl;
cout<<"op3 * op4 = "<<op3*op4<<endl;
cout<<"op3 / op4 = "<<op3/op4<<endl;
cout<<"op2 % op1 = "<<op2%op1<<endl;
}
Output:
Operands are op1 = 3 op2 = 4 op3 = 10.1 op4 = 5.4
op1 + op2 = 7
op1 – op2 = -1
op3 * op4 = 54.54
op3 / op4 = 1.87037
op2 % op1 = 1
The program defines operands first and then performs arithmetic operations on these operands. This program demonstrates the usage of arithmetic operators in C++.
The next arithmetic operators that we are going to discuss are ++ and –. These are called increment and decrement operators respectively. The increment operator increases the value of the operand by 1 while the decrement operator decreases the value of the operand by 1.
The expression x++ is equivalent to
x+=1;
x = x+1;
Similarly, the expression x—is equivalent to
x -=1;
x = x-1;
The increment and decrement operators can be placed as a prefix as well as a suffix to the operand. Depending on its placement, these operators have a different meaning to the evaluation of an expression.
When placed as a prefix, the increment/decrement operation is known as pre-increment or pre-decrement respectively. When placed as a suffix, the increment/decrement operation is called as post-increment or post-decrement operation respectively.
Whenever expressions are involved, in case of pre-increment or pre-decrement, the operation (increment or decrement) is carried out first and then the assignment is done. In the case of post-increment or post-decrement, the assignment is done first and the operation is carried out after that.
We can understand this better using the following Example.
#include <iostream>
#include <string>
using namespace std;
int main()
{
int x=4,y;
y = ++x;
cout<<"PreIncrement:Value of x = "<<x;
cout<<endl;
cout<<"PreIncrement:Value of y = "<<y;
cout<<endl;
y = x--;
cout<<"PostDecrement:Value of x = "<<x;
cout<<endl;
cout<<"PostDecrement:Value of y = "<<y;
cout<<endl;
}
Output:
PreIncrement:Value of x = 5
PreIncrement:Value of y = 5
PostDecrement:Value of x = 4
PostDecrement:Value of y = 5
This is the program to demonstrate the increment and decrement operators. Note that we have used pre-increment and post-decrement operators in this program. For the first expression, y=++x, as this is pre-increment, x will be incremented first and then the resultant value will be assigned to y. This is evident from the output that we have obtained.
In the second expression y=x–, the value of x which is now 5, will be assigned to y first and then the value of x will be decremented. Hence in the output, we can see that for post-decrement operation, the value of y is 5 while x is 4.
Logical Operators
Logical operators are used for evaluating a combination of conditions/constraints to get a resultant value. The result of the evaluation of a Boolean expression is Boolean which is either true or false.
C++ supports the following logical operators:
| Operator | Description |
|---|---|
| && | Logical AND: returns true if both conditions are true otherwise returns false. |
| || | Logical OR: returns true if one of the conditions is true. Returns false when both conditions are false. |
| ! | Logical NOT: negates the condition. |
C++ employs a short circuit method to evaluate logical expressions. In this, C++ has to evaluate only the first expression/operand of the logical expression to provide the result. For Example, for logical AND (&&) operator, C++ evaluates only the first expression. If it’s false then the result will be false even if the second condition is true.
Similarly, for logical OR (||), it evaluates only the first expression. If the first expression is true, then the result will be true so it need not evaluate the second expression.
Given below is an example that shows the usage of logical operators.
#include <iostream>
#include <string>
using namespace std;
int main()
{
int a=10, b=8,c=12,d=14;
if(!(a==0))
cout<<"a is not zero"<<endl;
else
cout<<"a is zero"<<endl; if((a>b)&&(c<d))
cout<<"Logical AND is true"<<endl;
else
cout<<"Logical AND is false"<<endl;
if((a<c)||(b<d))
cout<<"Logical OR is true"<<endl;
else
cout<<"Logical OR is false"<<endl;
}
Output:
a is not zero
Logical AND is true
Logical OR is true
In the above program, we have made use of all the three logical operators in order to evaluate expressions and print the results.
Relational Operators
Relational or comparison operators are used to compare two operands. The result of the evaluation is either true or false.
C++ supports the following Relational Operators:
| Operator | Description |
|---|---|
| !ERROR! A2 -> Formula Error: Unexpected operator '=' | Evaluates whether two operands are equal. Returns true if equal else returns false. |
| !=(not equal to) | Complements ‘equal to’ operator. Returns true if operands are not equal. False otherwise. |
| <(less than) | Returns true if the first operand is less than second. False otherwise. |
| <=(less than equal to) | Returns true if the first operand is less than or equal to the second operand. False otherwise. |
| >(greater than) | Returns true if the first operand is greater than second. False otherwise. |
| >=(greater than equal to) | Returns true if the first operand is greater than equal to the second. False otherwise. |
See the below Example program to understand the Relational Operators.
#include <iostream>
#include <string>
using namespace std;
int main()
{
int a=10, b=8,c=12,d=14;
if(a==b)
cout<<"a is equal to b"<<endl;
else
cout<<"a is not equal to b"<<endl;
if(c!=d)
cout<<"c is not equal to d"<<endl;
else
cout<<"c is equal to d"<<endl;
if((a+b) <= (c+d))
cout<<" (a+b) less than/equal to (c+d)"<<endl; if((a-b)>=(d-c))
cout<<"(a-b) greater than/equal to (d-c)"<<endl;
}
Output:
a is not equal to b
c is not equal to d
(a+b) less than/equal to (c+d)
(a-b) greater than/equal to (d-c)
In the above program, we see the usage of relational operators and the way in which they evaluate the expressions provided.
Note that we can provide not only values but also variables and expressions in the conditional statements.
Bitwise Operators
Bitwise operators in C++ operate on bits of the operands provided. Bitwise operators are applied only to integral types like integer, character, etc., and not on data types like float, double, etc.
Following are the bitwise operators supported by C++:
| Operators | Description |
|---|---|
| &( Binary AND) | Performs AND operation on bits of operand 1 and operand 2. |
| |( Binary OR) | Performs OR operation on bits of operand 1 and operand 2. |
| ^( Binary XOR) | Performs XOR operation on bits of operand 1 and operand 2. |
| ~( Binary one's complement) | Takes one operand and inverts its bits. |
| <<( Binary left shift operator) | Shifts bits of the first operand to the left to a number of bits specified by the second operand. |
| >>( Binary right shift operator) | Shifts bits of the first operand to the right to a number of places specified by the second operand. |
These bitwise operators operate on operands in a bit-by-bit manner. The truth tables for AND, OR and XOR operations are given below.
Consider a and b as two bits on which AND, OR and XOR operations are to be carried out.
The truth tables for the same are as given below:
| a | b | a&b | a|b | a^b |
|---|---|---|---|---|
| 0 | 0 | 0 | 0 | 0 |
| 1 | 0 | 0 | 1 | 1 |
| 0 | 1 | 0 | 1 | 1 |
| 1 | 1 | 1 | 1 | 0 |
Let’s taken an Example to understand Bitwise Operations.
Let a=8 and b=4
The binary representation of a and b is as follows:
a=8 1000
a=4 0100
a&b 0000 = 0
a|b 1100 = 12
a^b 1100 = 12
In the above example, we see that the bitwise AND of 8 and 4 is 0. Bitwise OR of 8 and 4 is 12 and bitwise XOR of 8 and 4 is as well 12.
This is the way in which bitwise operations are performed by the bitwise operators.
An Example demonstrating the Bitwise Operators.
#include <iostream>
#include <string>
using namespace std;
int main()
{
int a=8,b=4,c;
c = a&b;
cout<<"Result of & : "<<c<<endl;
c = a|b;
cout<<"Result of | : "<<c<<endl;
c = a^b;
cout<<"Result of ^ : "<<c<<endl;
c = a<<2;
cout<<"Result of << by 2 bits : "<<c<<endl; c = b>>2;
cout<<"Result of >> by 2 bits : "<<c<<endl;
c = ~3;
cout<<"Result of ~ : "<<c<<endl;
}
Output:
Result of & : 0
Result of | : 12
Result of ^ : 12
Result of << by 2 bits: 32
Result of >> by 2 bits: 1
Result of ~ : -4
In the above program, we demonstrated the usage of bitwise operators and also printed the output of each of the operation.
Assignment Operators
Assignment operator “=” is used to assigning a value to a variable. The LHS of the assignment operator is a variable and RHS is the value that is to be assigned to the variable. The value on the right side must be of the same type as that of the variable on the left-hand side.
Note the difference between ‘=’ and ‘==’ operators. The former is the assignment operator and the later is the equality operator.
Assignment operation takes place from right to left. Apart from the assignment operator ‘=’, there are other variations of assignment operator which are known as ‘compound assignment operators”. These operators perform an operation in addition to the assignment.
The below table gives us a description of these assignment operators.
| Operator | Description |
|---|---|
| = | Assigns the value of RHS operand to LHS operand |
| += | Adds RHS operand to LHS operand and assigns the result in LHS operand. |
| -= | Subtracts RHS operand to LHS operand and assigns the result to LHS operand |
| *= | multiplies RHS operand to LHS operand and assigns the result to LHS operand |
| /= | divides RHS operand to LHS operand and assigns the result to LHS operand |
As shown in the above table, If x and y are operands, x+=y is equivalent to x = x+y.
Similarly,
x -=y is equivalent to x = x-y.
x *= y is equivalent to x = x*y.
x /= y is equivalent to x = x/y.
The below programming Example demonstrates these Assignment Operators.
#include <iostream>
#include <string>
using namespace std;
int main()
{
int x,y;
cout<<"Enter input variable y: "; cin>>y;
x = y;
cout<<"\nValue of x = "<<x<<endl;
int a = 3,b = 5,c = 8;
a += b;
c -= b;
cout<<"\na += b: "<<a;
cout<<"\nc -= b: "<<c;
a *= b;
b /= c;
cout<<"\na *= b: "<<a;
cout<<"\nb /= c: "<<b;
return 0;
}
Output:
Enter input variable y: 4
Value of x = 4
a += b: 8
c -= b: 3
a *= b: 40
b /= c: 1
In the above example, we have demonstrated assignment as well as compound assignment operators.
Note: We can also combine the other binary operators like %, <<, >>, &, |, ^, etc. into compound assignment statements in addition to the ones that are already demonstrated.
Other Operators
So far we explored all the major operators in C++. There are some more additional C++ operators that need our attention.
These operators include:
(i) sizeof operator
sizeof is a unary operator that is used extensively in C and C++. Sizeof returns the size of its operand. The return value is usually an unsigned integral type denoted by ‘size_t’.
Sizeof operator has many uses in C and C++ languages. It can be used to find out the size of the variables, arrays or expressions and even to allocate the blocks of memory.
(ii) Conditional Ternary Operator
The conditional operator in C++ can be used as a replacement for if-else statement.
The general syntax for the conditional operator is:
Condition? expression1:expression2;
If the condition is true, expression 1 will be evaluated. If the condition is false, then expression2 will be evaluated.
Please note that expression1 and expression2 need to be of the same data types in order to avoid potential errors.
Suggested read => Ternary operator in C#
(iii) Comma Operator
Comma operator that is represented as a token ‘,’ can be used as an operator as well as a separator.
As an operator, a comma is used when there is more than one expression to be evaluated. Only the rightmost expression is assigned to LHS.
For Example, consider the following expression.
x = (y=4, y+1);
In this expression, we have two expressions on the right-side separated with a comma. Here comma acts as an operator. First, the expression, y=4 will be evaluated. Then the next expression y+1 will be evaluated by using the result of the first expression i.e. y=4. Thus the value of y+1 will be 5 and this value will be assigned to x.
As a separator, a comma can be used anywhere to separate definitions, parameter list, etc.
(iv) Member Access Operator
There are two operators that are used to access the individual members of classes, structures or unions in C++. These are the dot operator (.) and arrow (->) operator. We will learn these operators in detail when we learn object-oriented programming in C++.
The below Example demonstrates the usage of sizeof, Comma and Conditional Operator.
#include <iostream>
#include <string>
using namespace std;
int main()
{
int x,y;
x = (y=3,y+4);
cout<<"Value of x = "<<x;
y = (x<5)?0:1;
if(y == 0)
cout<<"\nVariable x is less than 5"<<endl;
else
cout<<"\nVariable x is greater than 5"<<endl;
cout<<"sizeof(x): "<<sizeof(x)<<"\t"<<"sizeof(y): "<<sizeof(y);
return 0;
}
Output:
Value of x = 7
Variable x is greater than 5
sizeof(x): 4 sizeof(y): 4
The screenshot for the same is given below.
As shown in the above program, first we have two variables declared and separated by a comma. (comma as a separator). Next, we have a comma operator with two expressions. As we can see from the output, the rightmost expression’s value is assigned to variable x. Next, we demonstrate the conditional operator to evaluate if x is less than 5.
Finally, we demonstrate the usage of the sizeof operator. Here we use the sizeof operator to get the size of the variables x and y. As both are integer variables, the size returned is 4 bytes.
(v) Operator Precedence and Associativity
We have already seen almost all the C++ operators and we know that they can be used in expressions to carry out specific operations. But the expressions we have seen in examples are simple and straightforward. However, depending on our requirements, expressions tend to become more and more complex.
Such complex expressions will have more than one operator and many operands. In such a situation, we need to evaluate which operator is to be evaluated first.
For Example, consider the following expression.
x = 4 + 5 / 3;
Here we have + and / operators and we need to decide which expression will be evaluated first. In mathematical terms, we know that division will be carried out before addition. Thus the expression will become x = 4 + (5/3) = 5.
But when the compiler is faced with such a situation, we also need to have a similar mechanism to decide the order of operations, so that it can properly evaluate the expression.
This order in which the operators in a compound expression are evaluated is called the “Precedence” of the operator. C++ has defined precedence for all the operators and the operators with higher precedence are evaluated first.
What happens when we have two operators side by side in an expression with the same precedence? This is where the associativity of an operator comes into the picture.
Associativity tells the compiler whether to evaluate an expression in left to right sequence or right to left sequence. Thus using precedence and associativity of an operator we can effectively evaluate an expression and get the desired result.
C++ provides a table consisting of precedence and associativity of various operators it uses.
This table is given below.
| Precedence/Associativity | Operator | Description |
|---|---|---|
| 1 None | :: :: | Scope resolution operator (unary) (binary) |
| 2 L->R | () () () {} type() type{} [] . -> ++ –– typeid const_cast dynamic_cast reinterpret_cast static_cast | Parentheses Function call Initialization Uniform initialization (C++11) Functional cast Functional cast (C++11) Array subscript Member access from the object Member access from object ptr Post-increment Post-decrement Run-time type information Cast away const Run-time type-checked cast Cast one type to anotherCompile-time type-checked cast |
| 3 R->L | + - ++ –– ! ~ (type) sizeof & * new new[] delete delete[] | Unary plus Unary minus Pre-increment Pre-decrement Logical NOT Bitwise NOT C-style cast Size in bytes Address of Dereference Dynamic memory allocation Dynamic array allocation Dynamic memory deletion Dynamic array deletion |
| 4 L->R | ->* .* | Member pointer selector Member object selector |
| 5 L->R | * / % | Multiplication Division Modulus |
| 6 L->R | + - | Addition Subtraction |
| 7 L->R | << >> | Bitwise shift left Bitwise shift right |
| 8 L->R | < <= > >= | Comparison less than Comparison less than or equals Comparison greater than Comparison greater than or equals |
| 9 L->R | !ERROR! B10 -> Formula Error: Unexpected operator '=' | Equality Inequality |
| 10 L->R | & | Bitwise AND |
| 11 L->R | ^ | Bitwise XOR |
| 12 L->R | | | Bitwise OR |
| 13 L->R | && | Logical AND |
| 14 L->R | || | Logical OR |
| 15 R->L | ?: = *= /= %= += -= <<= >>= &= |= ^= | Conditional (see note below) Assignment Multiplication assignment Division assignment Modulus assignment Addition assignment Subtraction assignment Bitwise shift left assignment Bitwise shift right assignment Bitwise AND assignment Bitwise OR assignment Bitwise XOR assignment |
| 16 R->L | throw | Throw expression |
| 17 L->R | , | Comma operator |
Notes:
- Precedence level 1 is the highest precedence level, and level 17 is the lowest. Operators with a higher precedence level get evaluated first.
- L->R means left to right associativity.
- R->L means right to left associativity.
Conclusion
This is all about the operators in C++.
We have discussed almost all the operators. Some specific operators that are present in the above precedence table which we have not discussed, will be discussed according to the topics that we cover in our upcoming tutorials.
=> See Here To Explore The Full C++ Tutorials list









