Skip to main content

Kotlin Operators

Operators are special symbols that perform operations on variables and values. Kotlin provides a rich set of operators that help you perform various operations like arithmetic calculations, comparisons, logical operations, and more.

Introduction to Kotlin Operators

In programming, operators are symbols that tell the compiler to perform specific mathematical, relational, or logical operations. Kotlin offers a variety of operators categorized based on their functions:

  • Arithmetic Operators
  • Assignment Operators
  • Comparison Operators
  • Logical Operators
  • Bitwise Operators
  • Range Operators
  • Special Operators

Understanding these operators is fundamental to writing efficient Kotlin code, and they form the building blocks of more complex operations in your applications.

Arithmetic Operators

Arithmetic operators are used to perform basic mathematical operations.

OperatorNameDescription
+AdditionAdds two values
-SubtractionSubtracts the right operand from the left
*MultiplicationMultiplies two values
/DivisionDivides the left operand by the right one
%ModulusReturns the remainder after division

Example of Arithmetic Operators

kotlin
fun main() {
val a = 10
val b = 3

println("Addition: ${a + b}") // Output: Addition: 13
println("Subtraction: ${a - b}") // Output: Subtraction: 7
println("Multiplication: ${a * b}") // Output: Multiplication: 30
println("Division: ${a / b}") // Output: Division: 3
println("Modulus: ${a % b}") // Output: Modulus: 1

// Float division
println("Float division: ${a.toFloat() / b}") // Output: Float division: 3.3333333
}

Assignment Operators

Assignment operators are used to assign values to variables.

OperatorExampleEquivalent To
=a = ba = b
+=a += ba = a + b
-=a -= ba = a - b
*=a *= ba = a * b
/=a /= ba = a / b
%=a %= ba = a % b

Example of Assignment Operators

kotlin
fun main() {
var x = 10

println("Initial value of x: $x") // Output: Initial value of x: 10

x += 5
println("After x += 5: $x") // Output: After x += 5: 15

x -= 3
println("After x -= 3: $x") // Output: After x -= 3: 12

x *= 2
println("After x *= 2: $x") // Output: After x *= 2: 24

x /= 4
println("After x /= 4: $x") // Output: After x /= 4: 6

x %= 4
println("After x %= 4: $x") // Output: After x %= 4: 2
}

Comparison Operators

Comparison operators are used to compare two values. They return a Boolean result (true or false).

OperatorNameDescription
==Equal toReturns true if both operands are equal
!=Not equal toReturns true if operands are not equal
>Greater thanReturns true if left operand is greater than right
<Less thanReturns true if left operand is less than right
>=Greater than or equal toReturns true if left operand is greater than or equal to right
<=Less than or equal toReturns true if left operand is less than or equal to right

Example of Comparison Operators

kotlin
fun main() {
val a = 10
val b = 20

println("a == b: ${a == b}") // Output: a == b: false
println("a != b: ${a != b}") // Output: a != b: true
println("a > b: ${a > b}") // Output: a > b: false
println("a < b: ${a < b}") // Output: a < b: true
println("a >= b: ${a >= b}") // Output: a >= b: false
println("a <= b: ${a <= b}") // Output: a <= b: true

// Comparing strings
val str1 = "Hello"
val str2 = "Hello"
println("str1 == str2: ${str1 == str2}") // Output: str1 == str2: true
}

Logical Operators

Logical operators are used to determine the logic between variables or values.

OperatorNameDescription
&&Logical ANDReturns true if both statements are true
||Logical ORReturns true if one of the statements is true
!Logical NOTReverses the result, returns false if the result is true

Example of Logical Operators

kotlin
fun main() {
val a = true
val b = false

println("a && b: ${a && b}") // Output: a && b: false
println("a || b: ${a || b}") // Output: a || b: true
println("!a: ${!a}") // Output: !a: false

// Practical example
val age = 25
val hasPermission = true

if (age >= 18 && hasPermission) {
println("Access granted") // This will be printed
} else {
println("Access denied")
}
}

Bitwise Operators

Kotlin provides infix functions for bitwise operations on integers.

OperationMethodDescription
Bitwise ANDand()Returns 1 if both bits are 1
Bitwise ORor()Returns 1 if at least one bit is 1
Bitwise XORxor()Returns 1 if exactly one bit is 1
Bitwise Inversioninv()Inverts all bits
Left Shiftshl()Shifts bits to the left
Right Shiftshr()Shifts bits to the right
Unsigned Right Shiftushr()Shifts bits to the right, filling with zeros

Example of Bitwise Operations

kotlin
fun main() {
val a = 12 // Binary: 1100
val b = 10 // Binary: 1010

println("a and b: ${a and b}") // Output: a and b: 8 (Binary: 1000)
println("a or b: ${a or b}") // Output: a or b: 14 (Binary: 1110)
println("a xor b: ${a xor b}") // Output: a xor b: 6 (Binary: 0110)

println("a.inv(): ${a.inv()}") // Output: a.inv(): -13 (Binary: inversion of 1100)

println("a shl 2: ${a shl 2}") // Output: a shl 2: 48 (Binary: 110000)
println("a shr 2: ${a shr 2}") // Output: a shr 2: 3 (Binary: 11)

// Unsigned right shift example
val negative = -8
println("negative shr 1: ${negative shr 1}") // Output: negative shr 1: -4
println("negative ushr 1: ${negative ushr 1}") // Output: depends on bit length, but will be positive
}

Range Operators

Kotlin provides range operators to create ranges of values.

OperatorDescription
..Creates an inclusive range
untilCreates a range excluding the end element
downToCreates a range that goes backward
stepDefines the increment step for the range

Example of Range Operators

kotlin
fun main() {
// Inclusive range (1 to 5)
for (i in 1..5) {
print("$i ") // Output: 1 2 3 4 5
}
println()

// Exclusive range (1 to 4)
for (i in 1 until 5) {
print("$i ") // Output: 1 2 3 4
}
println()

// Descending range (5 down to 1)
for (i in 5 downTo 1) {
print("$i ") // Output: 5 4 3 2 1
}
println()

// Range with step
for (i in 1..10 step 2) {
print("$i ") // Output: 1 3 5 7 9
}
println()

// Check if a value is in a range
val x = 3
if (x in 1..5) {
println("$x is in range") // Output: 3 is in range
}
}

Special Kotlin Operators

Kotlin introduces several special operators that make your code more expressive.

Elvis Operator (?:)

Used for null safety, returns the left expression if it's not null, otherwise returns the right expression.

kotlin
fun main() {
val name: String? = null
val displayName = name ?: "Unknown"
println(displayName) // Output: Unknown

val anotherName: String? = "Alice"
val anotherDisplayName = anotherName ?: "Unknown"
println(anotherDisplayName) // Output: Alice
}

Safe Call Operator (?.)

Calls a method or accesses a property only if the reference is non-null.

kotlin
fun main() {
val name: String? = null
println(name?.length) // Output: null

val anotherName: String? = "Alice"
println(anotherName?.length) // Output: 5
}

Not-null Assertion Operator (!!)

Converts a nullable type to a non-null type and throws a NullPointerException if the value is null.

kotlin
fun main() {
val name: String? = "Alice"
println(name!!.length) // Output: 5

// This would throw a NullPointerException
// val nullName: String? = null
// println(nullName!!.length)
}

Smart Casts and is Operator

Kotlin automatically casts an object after it's been checked with the is operator.

kotlin
fun main() {
val obj: Any = "Hello"

if (obj is String) {
// obj is automatically cast to String
println("String length: ${obj.length}") // Output: String length: 5
}

when (obj) {
is String -> println("It's a String") // Output: It's a String
is Int -> println("It's an Int")
else -> println("Unknown type")
}
}

Operator Overloading

One of Kotlin's powerful features is operator overloading, which allows you to define how operators work with your custom classes.

kotlin
data class Point(val x: Int, val y: Int) {
// Overloading the + operator
operator fun plus(other: Point): Point {
return Point(x + other.x, y + other.y)
}

// Overloading the - operator
operator fun minus(other: Point): Point {
return Point(x - other.x, y - other.y)
}
}

fun main() {
val p1 = Point(10, 20)
val p2 = Point(5, 15)

// Using the overloaded + operator
val sum = p1 + p2
println("Sum: $sum") // Output: Sum: Point(x=15, y=35)

// Using the overloaded - operator
val difference = p1 - p2
println("Difference: $difference") // Output: Difference: Point(x=5, y=5)
}

Real-world Application: Simple Calculator

Let's create a simple calculator application that uses various operators.

kotlin
fun main() {
println("Welcome to Simple Calculator")
println("Enter first number:")
val num1 = readLine()?.toDoubleOrNull() ?: 0.0

println("Enter operation (+, -, *, /, %):")
val operation = readLine() ?: "+"

println("Enter second number:")
val num2 = readLine()?.toDoubleOrNull() ?: 0.0

val result = when(operation) {
"+" -> num1 + num2
"-" -> num1 - num2
"*" -> num1 * num2
"/" -> if (num2 != 0.0) num1 / num2 else "Error: Division by zero"
"%" -> if (num2 != 0.0) num1 % num2 else "Error: Division by zero"
else -> "Invalid operation"
}

println("Result: $result")
}

Summary

In this comprehensive guide to Kotlin operators, we've covered:

  • Arithmetic operators for mathematical calculations
  • Assignment operators for setting variable values
  • Comparison operators for comparing values
  • Logical operators for combining boolean expressions
  • Bitwise operators for bit-level operations
  • Range operators for creating and working with ranges
  • Special Kotlin operators like Elvis, safe call, and not-null assertion
  • Operator overloading for custom classes
  • A practical application with a simple calculator

Understanding operators is essential for writing efficient Kotlin code, as they are the basic building blocks for more complex operations in your applications.

Exercises

To reinforce your learning, try these exercises:

  1. Create a temperature converter that converts between Celsius and Fahrenheit using arithmetic operators
  2. Write a function that checks if a number is within a certain range using range operators
  3. Create a custom Money class with overloaded operators for addition, subtraction, and comparison
  4. Write a program that counts set bits in an integer using bitwise operators
  5. Implement a simple expression evaluator that can handle basic arithmetic operations

Additional Resources



If you spot any mistakes on this website, please let me know at [email protected]. I’d greatly appreciate your feedback! :)