
Shankar LOperators Every Programmer Must Understand Why should you care? Almost every...
Almost every program you write contains operators.
You use them to:
For example:
```java id="1f8q2k"
int result = (a + b) * 2;
This single line contains multiple operators.
Understanding operators is not just about memorizing symbols.
You need to understand **what they do, how they interact, and how the computer evaluates expressions**.
---
## The Problem
Consider:
```java id="byr6ny"
int result = 10 + 5 * 2;
What is the result?
Is it:
```text id="3y6i5u"
30
or:
```text id="j7m5pj"
20
The answer is:
```text id="z9x5gq"
20
because multiplication has higher precedence than addition.
The expression is evaluated as:
```text id="83h2y8"
10 + (5 * 2)
Understanding operator precedence is essential because a small misunderstanding can completely change your program's behavior.
An operator is a symbol or construct that tells the language to perform an operation.
For example:
```java id="hjv6gl"
a + b
Here:
```text id="k0x5v9"
a and b → operands
+ → operator
Programming languages provide many types of operators.
The most important categories are:
```text id="1i8x0k"
Arithmetic
Assignment
Comparison
Logical
Increment / Decrement
Bitwise
Shift
Conditional
Let's understand each one.
---
## Arithmetic Operators
These operators perform mathematical operations.
| Operator | Meaning | Example |
| -------- | -------------- | ------- |
| `+` | Addition | `a + b` |
| `-` | Subtraction | `a - b` |
| `*` | Multiplication | `a * b` |
| `/` | Division | `a / b` |
| `%` | Remainder | `a % b` |
Example:
```java id="u9bjk2"
int a = 10;
int b = 3;
System.out.println(a + b); // 13
System.out.println(a - b); // 7
System.out.println(a * b); // 30
System.out.println(a / b); // 3
System.out.println(a % b); // 1
Notice:
```text id="q5f9u2"
10 / 3 = 3
not:
```text id="h7m8c1"
3.333...
because both operands are integers.
The % operator gives the remainder.
```java id="j2phm3"
10 % 3
gives:
```text id="1d7j4n"
1
Modulo is extremely useful.
For example, checking whether a number is even:
```java id="x6d2z7"
if (number % 2 == 0) {
System.out.println("Even");
}
You will use modulo frequently in competitive programming.
Common applications include:
* Even/odd checks
* Circular indexing
* Digit extraction
* Divisibility
* Hashing
* Modular arithmetic
---
## Assignment Operators
Assignment operators store values in variables.
The basic operator is:
```java id="zv1m8f"
=
Example:
```java id="5m3l8g"
int x = 10;
This means:
```text
Store 10 in x
There are also compound assignment operators.
```text id="i0nqyz"
+=
-=
*=
/=
%=
For example:
```java id="w7kqj9"
int x = 10;
x += 5;
is approximately equivalent to:
```java id="6j6z1x"
x = x + 5;
Similarly:
```java id="4zpx7k"
x *= 2;
means:
```text id="x7u5lm"
x = x * 2
---
## Comparison Operators
Comparison operators compare values.
| Operator | Meaning |
| -------- | --------------------- |
| `==` | Equal |
| `!=` | Not equal |
| `>` | Greater than |
| `<` | Less than |
| `>=` | Greater than or equal |
| `<=` | Less than or equal |
Example:
```java id="5qf7n3"
int age = 20;
System.out.println(age >= 18);
Output:
```text id="x8t0pd"
true
Comparison expressions generally produce a boolean result.
```text id="6t9f2a"
Expression
↓
true / false
= vs ==
This is one of the most common beginner mistakes.
```java id="j7x4yp"
x = 10;
means:
```text
Assignment
while:
```java id="1i7v4h"
x == 10
means:
```text
Comparison
Remember:
```text id="v9o5xm"
= → assign
== → compare
---
## Logical Operators
Logical operators combine boolean expressions.
The most important ones are:
```text id="8s9c2v"
&&
||
!
```java id="b2z6w4"
age >= 18 && hasId
Both conditions must be true.
```text
true && true → true
true && false → false
false && true → false
false && false → false
```java id="5k2n9f"
isAdmin || isOwner
At least one condition must be true.
### NOT
```java id="k3v7p1"
!isLoggedIn
It reverses the boolean value.
!true → false
!false → true
Logical operators in many languages use short-circuit evaluation.
Consider:
```java id="xw8r0v"
if (user != null && user.isActive()) {
...
}
If:
```text id="4p8z3y"
user != null
is false, the second condition may not be evaluated.
Why?
Because:
false && anything
is always false.
Similarly:
```java id="q0k5w3"
if (isAdmin || isOwner) {
...
}
If `isAdmin` is already true, the second condition may not need to be evaluated.
This is useful for both performance and safe condition ordering.
---
## Increment and Decrement
These operators modify a value by one.
```text id="q5c8m0"
++
--
Example:
```java id="b9r4n6"
int x = 5;
x++;
System.out.println(x);
Output:
```text id="3gq1f8"
6
But there is an important difference between:
```java id="h6t7j9"
++x
and:
```java id="0c5s7r"
x++
```java id="9e5m2q"
int x = 5;
int y = ++x;
First increment:
```text
x = 6
Then assign:
y = 6
```java id="n4h6y1"
int x = 5;
int y = x++;
First assign:
```text
y = 5
Then increment:
x = 6
This distinction becomes especially important inside loops and complex expressions.
Bitwise operators work directly on individual bits.
They are extremely important in:
The main operators are:
```text id="z8y4n2"
&
|
^
~
Consider:
```text id="w6k1q3"
A = 12
B = 10
In binary:
12 = 1100
10 = 1010
```text id="h2j7k5"
1100
1000
Result:
```text id="0n8d3x"
8
```text id="e4f9m2"
1100
1110
Result:
```text id="v3s7q1"
14
```text id="q6r2k8"
1100
0110
Result:
```text id="6a8k3m"
6
XOR returns 1 when the corresponding bits are different.
The ~ operator flips every bit.
```text id="w3f6p8"
0 → 1
1 → 0
For signed integers, the result can look surprising because modern systems typically use two's complement representation.
For example:
```java id="p7m2k4"
int x = 5;
System.out.println(~x);
produces:
```text id="f2z9q1"
-6
This is a good example of why understanding binary representation matters.
---
## Shift Operators
Shift operators move bits left or right.
```text id="x5n8m2"
<<
>>
>>>
For example:
```java id="b4k7q9"
int x = 4;
System.out.println(x << 1);
Binary:
```text id="d8s2v6"
0100
Shift left:
```text id="r5n1c7"
1000
Result:
```text id="w2k9m4"
8
A left shift by one position is equivalent to multiplying by two for values where the operation does not overflow.
Similarly:
```text id="3x7m1v"
8 >> 1
gives:
```text id="j6q4p2"
4
For signed values, right-shift behavior requires care because >> preserves the sign bit while >>> inserts zeros.
The ternary operator provides a compact conditional expression.
```java id="f8q3m1"
int max = a > b ? a : b;
This means:
```text id="n2v6k8"
If a > b
use a
otherwise
use b
It is useful for simple conditions.
Avoid using deeply nested ternary expressions because they quickly become difficult to read.
When multiple operators appear in an expression, precedence determines evaluation order.
For example:
```java id="y4n7k2"
int result = 10 + 5 * 2;
Multiplication happens first:
```text
10 + (5 * 2)
Therefore:
```text id="h8c2v5"
20
Parentheses make the intended order explicit:
```java id="k6m3p9"
int result = (10 + 5) * 2;
Now the result is:
```text id="r4x7n1"
30
A good programming habit is to use parentheses when they improve clarity, even when you already know the precedence rules.
---
## Common Mistakes
### Mistake 1: Using `=` instead of `==`
```java id="s5k8m2"
if (x = 10)
This is not a comparison.
Use:
```java id="p4n7q1"
if (x == 10)
---
### Mistake 2: Integer division
```java id="a6m2x9"
int result = 5 / 2;
The result is:
```text id="v8q3k5"
2
not:
```text
2.5
If you need floating-point division:
```java id="j1r6m8"
double result = 5.0 / 2;
---
### Mistake 3: Confusing logical and bitwise operators
These are different:
```text id="q9m4k7"
&&
and:
```text id="u3x8p2"
&
The first is logical AND.
The second is bitwise AND.
Similarly:
```text
|| ≠ |
Complex expressions can become difficult to reason about.
Instead of:
```java id="c7m2x4"
a && b || c && d
consider using:
```java id="p5n8q1"
(a && b) || (c && d)
The result may be the same, but the intent is much clearer.
Code such as:
```java id="m4x7k2"
x = x++ + ++x;
is difficult to understand and can lead to language-specific or surprising behavior.
Prefer simple, explicit code.
---
## Advanced Notes
### Operators Are Not Always CPU Instructions
Writing:
```java id="s8q2m6"
a + b
does not guarantee that the CPU executes exactly one ADD instruction.
The compiler or runtime may:
High-level operators are abstractions over lower-level operations.
Consider:
```java id="k5n9r3"
int x = 2_000_000_000;
int y = 2_000_000_000;
int result = x + y;
The mathematical result is:
```text
4,000,000,000
But this is outside the range of a Java int.
Therefore, the operation overflows.
This is why understanding both data types and operators is important.
Some languages allow programmers to define how operators behave for custom types.
For example, C++ allows:
a + b
to work with user-defined classes through operator overloading.
Java does not support general user-defined operator overloading.
The + operator is specially defined for numeric addition and String concatenation.
Operators connect expressions to computation.
```text id="x4m7p2"
Variables
↓
Values
↓
Operators
↓
Expressions
↓
Statements
↓
Program Logic
↓
Machine Instructions
For example:
```java id="n8q3v6"
if ((age >= 18) && hasId) {
allowEntry();
}
contains:
```text id="q2m5k9"
= → comparison
&& → logical AND
() → grouping
These operators combine to create a decision.
That is how simple machine-level operations eventually become complex application behavior.
Operators are the building blocks of expressions.
The most important categories are:
Arithmetic
Assignment
Comparison
Logical
Increment / Decrement
Bitwise
Shift
Conditional
Remember the fundamentals:
= assigns a value.== compares values.% gives the remainder.&&, ||, and ! operate on logical conditions.&, |, ^, and ~ operate on bits.<<, >>, and >>> shift bits.++ and -- modify values by one.The deeper lesson is that operators are not just symbols you memorize.
They are the interface between values, expressions, program logic, and the underlying computation performed by the machine.