Skip to content

Operators and Expressions in C Programming

This section explains operators and expressions in C programming. It covers the different types of operators: arithmetic, relational/comparison, logical, and bitwise—along with their precedence, associativity, and how expressions are evaluated.

What Are Operators and Expressions?

  • Operators: These are symbols in C that tell the computer to perform specific tasks, such as adding numbers, comparing values, or combining conditions. They are like tools that manipulate data in a program.
  • Expressions: An expression is a combination of values (like numbers or variables), operators, and sometimes parentheses that produces a single result when evaluated. For example, x + y is an expression that evaluates to a number if x and y are numbers.

Operators and expressions are essential for calculations, decision-making, and data manipulation in C programs.


Types of Operators

C programming includes several types of operators, each serving a specific purpose:

  • Arithmetic Operators: Handle mathematical operations like addition or division.
  • Relational/Comparison Operators: Compare two values to check if they are equal, greater, or less.
  • Logical Operators: Combine multiple conditions for decision-making.
  • Bitwise Operators: Work with the binary (1s and 0s) representation of numbers.

Each type is explored below with examples to make them clear.


1. Arithmetic Operators

Arithmetic operators perform basic math operations on numbers, such as integers (int) or floating-point numbers (float). They are commonly used for calculations in C programs.

Common Arithmetic Operators

Operator Description Example
+ Addition x + y (e.g., x = 7, y = 29)
- Subtraction x - y (e.g., x = 7, y = 25)
* Multiplication x * y (e.g., x = 7, y = 214)
/ Division x / y (e.g., x = 15, y = 35)
% Modulus (remainder) x % y (e.g., x = 15, y = 43)
++ Increment (increase by 1) x++ (e.g., x = 56)
-- Decrement (decrease by 1) x-- (e.g., x = 54)

Examples

Calculating a total:

#include <stdio.h>
int main() {
    int x = 25;  // price
    int y = 4;   // quantity
    int total = x * y;  // Expression: x * y
    printf("Total: %d\n", total);  // Output: Total: 100
    return 0;
}

Here, * multiplies x and y, and the expression x * y evaluates to 100.

Using increment and modulus:

#include <stdio.h>
int main() {
    int x = 10;
    int y = 3;
    int incremented = x++;  // x++ returns x (10), then increments x to 11
    int remainder = x % y;  // 11 % 3 = 2
    printf("Incremented: %d, Remainder: %d\n", incremented, remainder);
    // Output: Incremented: 10, Remainder: 2
    return 0;
}

The ++ operator increases x after returning its original value, and % computes the remainder.


2. Relational/Comparison Operators

Relational operators (also called comparison operators) compare two values and return 1 (True) or 0 (False) in C. They are used in decision-making, such as in if statements.

Common Relational/Comparison Operators

Operator Description Example
== Equal to x == y (e.g., x = 6, y = 61)
!= Not equal to x != y (e.g., x = 6, y = 41)
> Greater than x > y (e.g., x = 6, y = 41)
< Less than x < y (e.g., x = 6, y = 40)
>= Greater than or equal to x >= y (e.g., x = 6, y = 61)
<= Less than or equal to x <= y (e.g., x = 4, y = 61)

Examples

Checking eligibility:

#include <stdio.h>
int main() {
    int x = 16;  // age
    int y = 18;  // minimum age
    int can_drive = x >= y;  // Expression: x >= y
    printf("Can drive: %d\n", can_drive);  // Output: Can drive: 0 (False)
    return 0;
}

The >= operator checks if x is at least y, returning 0 since 16 is less than 18.

Comparing values:

#include <stdio.h>
int main() {
    int x = 10;
    int y = 5;
    int is_equal = x == y;  // x == y → 0 (False)
    int is_greater = x > y; // x > y → 1 (True)
    printf("Equal: %d, Greater: %d\n", is_equal, is_greater);
    // Output: Equal: 0, Greater: 1
    return 0;
}

The == and > operators compare x and y, producing boolean results.


3. Logical Operators

Logical operators combine multiple conditions (often relational expressions) to create complex logic. They return 1 (True) or 0 (False) in C.

Common Logical Operators

Operator Description Example
&& Logical AND (True if both conditions are True) x && y (e.g., x = 1, y = 11)
|| Logical OR (True if at least one condition is True) x || y (e.g., x = 1,y = 01)
! Logical NOT (Reverses truth value) !x (e.g., x = 10)

Examples

Checking offer eligibility:

#include <stdio.h>
int main() {
    int x = 1;   // is_member (1 for True)
    int y = 20;  // age
    int qualifies = x && y > 18;  // Expression: x && (y > 18)
    printf("Qualifies: %d\n", qualifies);  // Output: Qualifies: 1 (True)
    return 0;
}

The && operator checks if both conditions are true, returning 1 since x is 1 and y > 18 is true.

Checking alternative conditions:

#include <stdio.h>
int main() {
    int x = 0;  // has_ticket (0 for False)
    int y = 1;  // is_member (1 for True)
    int can_enter = x || y;  // Expression: x || y
    printf("Can enter: %d\n", can_enter);  // Output: Can enter: 1 (True)
    return 0;
}

The || operator returns 1 if either condition is true, so can_enter is 1.


4. Bitwise Operators

Bitwise operators work on the binary representations of numbers (i.e., their 1s and 0s). They are used in low-level programming, such as hardware control or optimization, and are less common for beginners.

Common Bitwise Operators

Operator Description Example
& Bitwise AND x & y (e.g., x = 6 (110), y = 3 (011)2 (010))
| Bitwise OR x | y (e.g., x = 6 (110),y = 3 (011)7 (111))
^ Bitwise XOR x ^ y (e.g., x = 6 (110), y = 3 (011)5 (101))
~ Bitwise NOT ~x (e.g., x = 6 (110)-7 in two’s complement)
<< Left shift x << y (e.g., x = 6 (110), y = 112 (1100))
>> Right shift x >> y (e.g., x = 6 (110), y = 13 (011))

Examples

Bitwise AND:

#include <stdio.h>
int main() {
    int x = 6;  // Binary: 110
    int y = 3;  // Binary: 011
    int result = x & y;  // 110 & 011 = 010 (2)
    printf("Result: %d\n", result);  // Output: Result: 2
    return 0;
}

The & operator compares each bit, producing 1 only if both bits are 1.

Bitwise left shift:

#include <stdio.h>
int main() {
    int x = 6;  // Binary: 110
    int y = 1;
    int shifted = x << y;  // Shifts 110 to 1100 (12)
    printf("Shifted: %d\n", shifted);  // Output: Shifted: 12
    return 0;
}

The << operator shifts bits left, effectively multiplying x by 2^y.


Precedence and Associativity

When an expression contains multiple operators, C uses precedence and associativity to determine the order of evaluation.

  • Precedence: Defines which operators are evaluated first. Operators with higher precedence are applied before those with lower precedence.
  • Associativity: When operators have the same precedence, associativity decides whether they are evaluated from left to right or right to left.

Operator Precedence (High to Low)

  1. Parentheses ()
  2. Unary operators: ++, --, !, ~, unary +, -
  3. Multiplication, division, modulus: *, /, %
  4. Addition, subtraction: +, -
  5. Bitwise shifts: <<, >>
  6. Relational operators: <, >, <=, >=
  7. Equality operators: ==, !=
  8. Bitwise AND: &
  9. Bitwise XOR: ^
  10. Bitwise OR: |
  11. Logical AND: &&
  12. Logical OR: ||

Associativity

  • Left-to-right: Most operators, like +, -, *, /, %, &&, ||, are evaluated from left to right when they have the same precedence.
  • Right-to-left: Unary operators (++, --, !, ~) and assignment operators are evaluated from right to left.
  • Parentheses override precedence, allowing programmers to control evaluation order.

Examples

Precedence in action:

#include <stdio.h>
int main() {
    int x = 8, y = 4, z = 2;
    int result = x + y * z;  // * has higher precedence
    // Step 1: y * z = 4 * 2 = 8
    // Step 2: x + 8 = 8 + 8 = 16
    printf("Result: %d\n", result);  // Output: Result: 16
    return 0;
}

The * operator is evaluated before + due to higher precedence.

Associativity with same precedence:

#include <stdio.h>
int main() {
    int x = 10, y = 4, z = 2;
    int result = x - y - z;  // - has same precedence, left-to-right
    // Step 1: x - y = 10 - 4 = 6
    // Step 2: 6 - z = 6 - 2 = 4
    printf("Result: %d\n", result);  // Output: Result: 4
    return 0;
}

Since - operators have the same precedence, they are evaluated left-to-right.

Using parentheses:

#include <stdio.h>
int main() {
    int x = 8, y = 4, z = 2;
    int result = (x + y) * z;  // Parentheses change order
    // Step 1: x + y = 8 + 4 = 12
    // Step 2: 12 * z = 12 * 2 = 24
    printf("Result: %d\n", result);  // Output: Result: 24
    return 0;
}

Parentheses force x + y to evaluate first, overriding default precedence.


Expression Evaluation

An expression in C combines values, variables, and operators to produce a single result, such as an integer, float, or boolean (1 or 0). The process of computing this result is called evaluation.

How Expressions Are Evaluated

  1. Parse the Expression: The compiler identifies operators and operands (values or variables).
  2. Apply Precedence: Operators with higher precedence are evaluated first.
  3. Apply Associativity: For operators with the same precedence, the order (left-to-right or right-to-left) is followed.
  4. Compute Step-by-Step: Each operation produces an intermediate result until the final value is obtained.

Example

Evaluate the expression x + y * z > w || !v with x = 12, y = 6, z = 3, w = 20, v = 1:

#include <stdio.h>
int main() {
    int x = 12, y = 6, z = 3, w = 20, v = 1;
    int result = x + y * z > w || !v;
    // Step 1: y * z = 6 * 3 = 18 (* has higher precedence)
    // Step 2: x + 18 = 12 + 18 = 30 (+ next)
    // Step 3: 30 > w = 30 > 20 = 1 (True, relational)
    // Step 4: !v = !1 = 0 (False, logical NOT)
    // Step 5: 1 || 0 = 1 (True, logical OR)
    printf("Result: %d\n", result);  // Output: Result: 1 (True)
    return 0;
}

This example shows how precedence (* before +, > before ||) and associativity guide the evaluation process.

Another Example

Evaluate x - y + z * w with x = 10, y = 4, z = 2, w = 3:

#include <stdio.h>
int main() {
    int x = 10, y = 4, z = 2, w = 3;
    int result = x - y + z * w;
    // Step 1: z * w = 2 * 3 = 6 (* has higher precedence)
    // Step 2: x - y = 10 - 4 = 6 (- and + have same precedence, left-to-right)
    // Step 3: 6 + 6 = 12
    printf("Result: %d\n", result);  // Output: Result: 12
    return 0;
}

Here, * is evaluated first, then - and + are evaluated left-to-right.


Tips for Beginners

  • Use Parentheses: They make expressions clearer and let you control the order of operations. For example, (x + y) * z ensures x + y is evaluated first.
  • Test Small Programs: Write simple C programs to try out expressions and see their results.
  • Practice Real-World Scenarios: Try writing expressions for tasks like calculating a bill or checking conditions (e.g., age >= 18).
  • Understand Precedence: Memorizing the precedence table helps avoid errors in complex expressions.

Conclusion

Operators and expressions are the core of C programming, enabling calculations, comparisons, and logical decisions. Arithmetic operators handle math, relational/comparison operators check conditions, logical operators combine conditions, and bitwise operators manipulate binary data. Precedence and associativity determine how expressions are evaluated, and parentheses provide control when needed.