Back to C Programming
2025-12-085 min read

Logical and operator

Learn Logical and operator step by step with clear examples and exercises.

Title: Mastering Logical Operators in C Programming

Why This Matters

Logical operators are fundamental building blocks in C programming, enabling you to combine multiple conditions and make complex decisions within your code. They help write more efficient, readable, and maintainable programs. A solid understanding of logical operators is crucial for excelling in coding interviews, debugging real-world issues, and developing robust applications.

Prerequisites

Before delving into logical operators, ensure you have a good understanding of the following concepts:

  1. Basic C syntax and variables
  2. Control structures (if, if-else, switch)
  3. Arithmetic and comparison operators
  4. Data types and their ranges
  5. Understanding of functions and arrays
  6. Familiarity with pointers (optional but recommended for advanced topics)
  7. Basic concepts of Boolean algebra
  8. Understanding of truth tables

Core Concept

Logical operators in C apply standard boolean algebra operations to their operands. They help evaluate complex conditions by combining simpler ones. There are three logical operators: !, &&, and ||.

Logical NOT (!)

The logical NOT operator has the form ! expression, where expression is any scalar type. It returns 0 if expression evaluates to a non-zero value, otherwise it returns 1. In other words, ! E is equivalent to (0 == E). Here's an example:

#include <stdio.h>
int main ( void ) {
int a = 5;
printf("!(a == 3) = %d\n", ! (a == 3)); // NOT equal to 3
}

Output: !(a == 3) = 1

Logical AND (&&)

The logical AND operator has the form lhs && rhs, where lhs and rhs are expressions of any scalar type. It evaluates to 1 if both lhs and rhs evaluate to non-zero values, otherwise it returns 0. Here's an example:

#include <stdio.h>
int main ( void ) {
int a = 5;
int b = 10;
printf("(a > 4) && (b < 20) = %d\n", (a > 4) && (b < 20)); // Both conditions are true
}

Output: (a > 4) && (b < 20) = 1

Logical OR (||)

The logical OR operator has the form lhs || rhs, where lhs and rhs are expressions of any scalar type. It evaluates to 1 if either lhs or rhs evaluate to a non-zero value, otherwise it returns 0. Here's an example:

#include <stdio.h>
int main ( void ) {
int a = 0;
int b = 10;
printf("(a > 5) || (b < 15) = %d\n", (a > 5) || (b < 15)); // Either condition is true
}

Output: (a > 5) || (b < 15) = 1

Worked Example

Let's create a simple program that checks if a user is eligible to vote in India. To be eligible, the user must be at least 18 years old and a citizen of India.

#include <stdio.h>
int main ( void ) {
int age = 20;
bool isIndianCitizen = true;
bool canVote = (age >= 18) && isIndianCitizen;
printf("Can the user vote? %s\n", canVote ? "Yes" : "No");
}

Output: Can the user vote? Yes

Short-Circuit Evaluation

Logical OR and AND operators perform short-circuit evaluation, meaning that the right operand is only evaluated if necessary. For example, in the following expression, the second condition (b > 10) will not be evaluated when a < b is already true:

( a < b ) || ( b > 10 )

Common Mistakes

  1. Forgetting parentheses: Logical operators have higher precedence than comparison operators, but lower than arithmetic ones. This can lead to unexpected results if you forget parentheses.
// Incorrect: 5 > 3 && 7 < 2 will always be false!
int result = 5 > 3 && 7 < 2;
printf("%d\n", result); // Output: 0

// Correct: (5 > 3) && (7 < 2) will give the correct result: 1
int result = (5 > 3) && (7 < 2);
printf("%d\n", result); // Output: 1
  1. Assuming short-circuit evaluation guarantees order of evaluation: While short-circuit evaluation can prevent unnecessary computations, it does not guarantee the order of evaluation. To ensure proper execution, use parentheses or avoid combining multiple conditions in a single logical expression whenever possible.
// Incorrect: (a > b) || (b > c) will evaluate to true even if a < c!
int result = (a > b) || (b > c);
printf("%d\n", result); // Output: 1, assuming a < c

// Correct: (a > b) && (b > c) ensures that both conditions are met before evaluating the result.
int result = (a > b) && (b > c);
printf("%d\n", result); // Output: 0, if a < c
  1. Using logical operators with non-boolean values: Logical operators expect boolean values (0 or 1). If you use a non-boolean value, it will be converted to a boolean using the following rules:
  • Zero and empty strings are considered false (0)
  • All other numbers, including negative ones, are considered true (non-zero)
  • All other values, including strings with length greater than zero, are also considered true (non-zero)
#include <stdio.h>
int main ( void ) {
int a = 0;
char* str = "";
printf("!(a == 3) = %d\n", ! a); // NOT equal to 3
printf!("(str != \"Hello\") = %d\n", !(strcmp(str, "Hello"))); // NOT equal to "Hello"
}

Output: !(a == 3) = 1, (str != "Hello") = 1

Practice Questions

  1. Write a program to check if a number is even or odd using logical operators.
  2. Write a program to find the largest among three numbers using logical operators.
  3. Write a program that checks if a year is a leap year using logical operators.
  4. Write a program that checks if a given password meets the following requirements: at least 8 characters, contains at least one digit, and at least one uppercase letter.
  5. Write a program to find the smallest number among three numbers using logical operators.
  6. Write a program to check if a string is a palindrome using logical operators.
  7. Write a program that finds the maximum of two integers using logical operators without using comparison operators.
  8. Write a function that checks if an array contains a specific value using logical operators.
  9. Write a program that checks if a given number is prime using logical operators.
  10. Write a program to find the factorial of a number using logical operators (without recursion).

FAQ

  1. What happens when you use a logical operator with a non-boolean value?

Logical operators expect boolean values (0 or 1). If you use a non-boolean value, it will be converted to a boolean using the following rules:

  • Zero and empty strings are considered false (0)
  • All other numbers, including negative ones, are considered true (non-zero)
  • All other values, including strings with length greater than zero, are also considered true (non-zero)
  1. Can I use logical operators with pointers or arrays?

Yes, you can use logical operators with pointers and arrays, but keep in mind that the result will be a boolean value (0 or 1). For example:

int arr[3] = {5, 10, 15};
bool isGreaterThanTen = arr[0] > 10 || arr[1] > 10 || arr[2] > 10;
printf("%d\n", isGreaterThanTen); // Output: 1