TutorChase logo
Login
AQA A-Level Computer Science

1.1.3 Arithmetic, relational and Boolean operations

Arithmetic operators

Arithmetic operators form the backbone of most computational logic in programming. They allow for numerical manipulation, which is essential in algorithm development, data processing, and solving mathematical problems programmatically.

Addition (+)

The addition operator combines two numerical values and returns their sum. It is commonly used in tasks such as summing values, incrementing counters, and accumulating results across iterations.

Example:

python

total = 4 + 6  # total becomes 10

Addition is associative (i.e. (a + b) + c = a + (b + c)) and commutative (i.e. a + b = b + a), so the order in which operands are added does not affect the final result. This property is useful when optimizing arithmetic expressions or rearranging code.

Subtraction (−)

Subtraction calculates the difference between two values. Unlike addition, subtraction is not commutative: a - b is not the same as b - a unless a equals b.

Example:

python

difference = 10 - 3  # difference becomes 7

Subtraction is often used when calculating changes in value, such as reductions in stock, measuring differences between values, or computing offsets.

Multiplication (*)

Multiplication returns the product of two operands. Like addition, it is both commutative and associative.

Example:

python

product = 5 * 4  # product becomes 20

Multiplication is used in scenarios involving scaling (e.g. doubling a value), repeated addition (e.g. total cost = quantity price), area calculations (length width), and various algorithms.

Division

Division splits one number by another and comes in two main forms:

Float Division (/)

This form of division returns a floating-point (decimal) result.

Example:

python

quotient = 7 / 2  # quotient becomes 3.5

It is used when precision is needed, especially in financial applications, average calculations, or any context where partial units matter.

Integer Division (// or DIV)

This form returns only the whole number part of the result, discarding any remainder.

Example:

python

quotient = 7 // 2  # quotient becomes 3

This is often used in loop control, determining how many times a value fits into another, or when index values must remain whole numbers.

Modulus (% or MOD)

The modulus operator gives the remainder from a division operation.

Example:

python

remainder = 10 % 3  # remainder becomes 1

This is especially useful for:

  • Checking if a number is even or odd:

    • Even: x % 2 == 0

    • Odd: x % 2 == 1

  • Implementing wrap-around logic, such as rotating through array indices or looping back to the start after reaching the end.

Exponentiation (** or ^)

Exponentiation raises a number (the base) to the power of another number (the exponent).

Example:

python

power = 2 ** 3  # power becomes 8

Used in:

  • Calculations involving geometric growth or decay

  • Mathematical modeling

  • Area and volume formulas (e.g. r 2 or r 3)

Rounding

Rounding converts a floating-point number to its nearest whole number. It is often required when formatting outputs or working in domains like finance where decimals need simplification.

Example:

python

round(4.6)  # returns 5
round(4.4)  # returns 4

The built-in round() function is typically used, and it follows standard mathematical rules of rounding up if the decimal is 0.5 or more.

Truncation

Truncation discards the fractional part of a number without rounding.

Example:

python

int(4.9)  # returns 4

Used in:

  • Indexing

  • Loop counters

  • Scenarios where only whole-number results are valid or desired

Relational operators

Relational operators compare two values and return a Boolean result — either True or False. They are critical in making decisions within conditional statements, controlling loops, and validating user inputs.

Equal to (== or =)

Checks whether two values are equal.

Example:

python

5 == 5  # returns True

Commonly used in:

  • Comparisons in if statements

  • Input verification

  • Loop termination conditions

Not equal to (!= or ≠)

Returns true if the values are not the same.

Example:

python

7 != 3  # returns True

Frequently used to continue processing until a particular condition becomes true, e.g. input validation loops or to trigger events only when values differ.

Greater than (>)

Returns true if the left operand is greater than the right.

Example:

python

9 > 5  # returns True

Useful in:

  • Ensuring thresholds are exceeded before action

  • Detecting errors (e.g. temperature too high)

  • Loop bounds

Less than (<)

Returns true if the left operand is less than the right.

Example:

python

2 < 7  # returns True

Common in sorting logic, minimum checks, or loop control structures.

Greater than or equal to (>= or ≥)

Returns true if the left operand is greater than or equal to the right.

Example:

python

6 >= 6  # returns True

Often used to enforce lower bounds or allow equality within thresholds.

Less than or equal to (<= or ≤)

Returns true if the left operand is less than or equal to the right.

Example:

python

3 <= 4  # returns True

Helps create upper limits and inclusive conditions for comparisons.

Boolean operators

Boolean operators combine or alter Boolean values, making it possible to build more complex logic statements. These are at the heart of conditionals in all programming languages.

NOT

Reverses the Boolean value of its operand.

Example:

python

not True        # returns False
not (5 > 2)     # returns False

Used when you want to trigger an action only when a condition is not met. While powerful, overuse of not can make code harder to read, especially in compound expressions.

AND

Returns true only if both operands are true.

Example:

python

(4 > 2) and (3 < 5)  # returns True

This is vital when all conditions must be satisfied. It's commonly used in permission checks, validations, and strict logic gates.

OR

Returns true if at least one operand is true.

Example:

python

(4 < 2) or (3 < 5)  # returns True

It’s used in situations where any one condition being true is sufficient to proceed.

XOR (exclusive OR)

Returns true only when exactly one operand is true, not both.

Example:

python

True ^ False  # returns True
True ^ True   # returns False

Used in:

  • Logic circuits

  • Toggles

  • Conditions where mutually exclusive scenarios apply

Operator precedence

Operator precedence defines the order in which operations are evaluated in a complex expression. Misunderstanding precedence can lead to logical errors and unintended behavior in code. Parentheses can be used to override default precedence and clarify intentions.

Precedence hierarchy (highest to lowest):

  1. Brackets ()

  2. Exponentiation ** or ^

  3. Multiplication *, Division /, Modulus %, Integer Division //

  4. Addition +, Subtraction -

  5. Relational Operators: ==, !=, <, >, <=, >=

  6. NOT

  7. AND

  8. OR

  9. XOR

Example:

python

result = 4 + 5 * 2  # result is 14

In this case, multiplication occurs before addition: 5 * 2 = 10, then 4 + 10 = 14.

To change the order of execution:

python

result = (4 + 5) * 2  # result is 18

Boolean precedence example:

python

if not A or B and C:

This is evaluated in the following order:

  1. not A

  2. B and C

  3. Result of step 1 OR result of step 2

To clarify the intent, use brackets:

python

if (not A) or (B and C):

Evaluating complex expressions

Real-world conditions often mix arithmetic, relational, and Boolean operations. Understanding how to evaluate these expressions step-by-step is key to ensuring correct logic flow.

Step-by-step evaluation guide:

  1. Evaluate arithmetic expressions first

    • Any operations like addition, subtraction, etc.

  2. Evaluate relational expressions

    • Use the results of arithmetic to compare and get Boolean values.

  3. Apply Boolean operators

    • Combine Boolean results using not, and, or, etc.

Example:

python

if ((a + b > 10) and (c < 5)) or not valid:

This is evaluated as:

  • Compute a + b

  • Compare a + b > 10 → Boolean

  • Compare c < 5 → Boolean

  • Combine with and

  • Evaluate not valid

  • Combine all using or

Good practices and common mistakes

Best practices

  • Use brackets liberally to make expressions clear and avoid reliance on precedence rules.

  • Split complex conditions into multiple variables or lines for clarity and maintainability.

  • Choose meaningful variable names that reflect Boolean logic (e.g. isReady, hasPermission).

  • Test expressions with a wide range of inputs, including edge cases.

Common mistakes

  • Confusing assignment and comparison: Using = instead of == leads to logical bugs.

  • Incorrect division usage: Using / when // or % was intended can affect loop or indexing logic.

  • Misunderstanding precedence: Omitting brackets can result in unexpected outcomes.

  • Overusing not: Nesting or misplacing not can obscure intent.

  • Short-circuit logic misuse: In many languages, and/or stop evaluating once the outcome is determined; this can be exploited or cause overlooked bugs if not accounted for.

FAQ

The order of Boolean operations matters because logical operators like not, and, and or have different precedence levels. If they are not evaluated in the correct sequence, the final result of the expression may be incorrect. For example, not A or B is not the same as not (A or B). Without proper ordering, especially in long compound conditions, you might evaluate part of the expression too early or in the wrong order, leading to unintended results. In many programming languages, including Python, the precedence is: not first, then and, followed by or. This means not A or B and C is evaluated as (not A) or (B and C) unless brackets override it. This order ensures logical flow, but when the expression gets complex or includes mixed conditions, it's safer to use brackets to group sub-expressions deliberately. This both clarifies the intended logic and prevents subtle bugs.

Short-circuit evaluation is a technique used by many programming languages where the second part of a Boolean expression is not evaluated if the first part determines the result. In an and operation, if the first operand is False, the whole expression must be False, so the second operand is skipped. For or, if the first operand is True, the entire expression is True, and again the second part is skipped. This can significantly affect program behaviour, particularly when the second operand includes function calls or expressions with side effects like changing variables or accessing input. For instance, in A != 0 and B / A > 2, if A is zero, the division is never attempted because A != 0 is false, preventing a divide-by-zero error. Understanding short-circuit logic helps write efficient and safe conditional statements by ensuring certain conditions are only checked when necessary.

When combining arithmetic and Boolean operations, the expression is evaluated using operator precedence rules, starting with arithmetic, followed by relational, then Boolean operators. Arithmetic operations such as addition or multiplication are computed first, then comparisons like < or convert the result into Boolean values, which are finally evaluated using logical operators such as and or or. For example, in (5 + 3 > 6) and (2 2 4), the arithmetic parts 5 + 3 and 2 2 are calculated first. Then 8 > 6 and 4 == 4 are evaluated as True and True, and finally True and True gives True. Problems arise if this order is misunderstood. For example, writing a Boolean expression that includes arithmetic without proper bracketing can lead to logical errors. Therefore, it’s good practice to use brackets to group related components clearly and ensure readability and accuracy of logic.

Overusing not in complex expressions can make code harder to read and increase the likelihood of logical errors. While not is simple in isolation, when it's nested or combined with and, or, and relational comparisons, it can quickly create confusing conditions. For example, the expression not (x > 10 or y < 5) requires mental effort to understand that it’s logically equivalent to (x <= 10 and y >= 5)—a form that's often clearer. Inverting logic also complicates debugging, especially when the logic already involves multiple layers of conditions. It’s often better to rephrase expressions positively or explicitly where possible. Additionally, applying not to complex compound expressions without parentheses can lead to unintended results due to operator precedence. To mitigate these issues, keep expressions readable by avoiding double negatives and instead using relational operators directly. Where not is necessary, enclose sub-expressions in brackets to clarify intent and ensure proper evaluation.

Arithmetic operators can behave differently depending on the data types they operate on, potentially causing unexpected outcomes. For example, adding two integers returns an integer, but adding an integer and a float will return a float. Similarly, the + operator can also be used for string concatenation in some languages, meaning 4 + "2" might result in an error or "42" depending on context. Division is another critical area: in Python, 7 / 2 returns 3.5 (float), while 7 // 2 returns 3 (int). Mixing types without clear conversion can lead to logic errors or data loss, especially when truncating floats to ints. Using modulus with floats may yield results with unexpected decimal precision due to binary representation issues. To avoid problems, always be aware of the types involved and use explicit type conversion (int(), float(), etc.) where necessary. Understanding how each operator interacts with various types helps maintain accuracy and prevents subtle bugs.

Practice Questions

A programmer writes the following expression in Python: (5 + 3 * 2) > 10 and not (4 == 2 + 2). Explain the step-by-step evaluation of this expression and state the final Boolean result.

The expression follows operator precedence rules. First, multiplication is performed: 3 * 2 = 6. Then addition: 5 + 6 = 11. The first relational operation becomes 11 > 10, which is True. Inside the not expression, the addition 2 + 2 = 4 is evaluated, followed by the comparison 4 == 4, which is True. Applying not gives False. Now, the expression simplifies to True and False, which evaluates to False. Therefore, the final Boolean result of the entire expression is False.

Describe the difference between integer division and modulus operations, including their syntax in Python and one practical use case for each.

Integer division in Python uses the // operator and returns the whole number part of a division, discarding any remainder. For example, 10 // 3 gives 3. Modulus uses the % operator and returns the remainder of the division, so 10 % 3 gives 1. A practical use case for integer division is calculating how many full boxes can be packed when given a total number of items and box size. Modulus is useful for checking whether a number is even or odd, such as using x % 2 == 0 to determine if x is even.

Hire a tutor

Please fill out the form and we'll find a tutor for you.

1/2
Your details
Alternatively contact us via
WhatsApp, Phone Call, or Email