Infinite while loops in C++


Loops bring great power but also great responsibility. The biggest danger when using loops is writing an infinite loop.

An infinite loop is a loop that never terminates. For example, if we forget to increment i in our previous example:

int i = 1;
while(i < 5) {
	cout << i << endl;
	// i++; => forgot this
}

This program will never terminate as i will always have value 1 and thus the condition i < 5 will always be satisfied.

The program would basically print 1 forever never exiting the while loop.


Pro Tip:

As programmers, we want to make sure we never write infinite loops as they make our program run forever and completely unusable.


Assignment
Follow the Coding Tutorial and practice with infinite while loops!


Hint
Look at the examples above if you get stuck.


Introduction

In this lesson, we will explore the concept of infinite while loops in C++. Understanding how to control loops is crucial for writing efficient and bug-free code. Infinite loops can cause programs to become unresponsive and consume system resources unnecessarily. This lesson will help you understand how to avoid such pitfalls.

Understanding the Basics

A loop is a fundamental programming construct that allows you to repeat a block of code multiple times. The while loop in C++ continues to execute as long as a specified condition is true. However, if the condition never becomes false, the loop will run indefinitely, creating an infinite loop.

Consider the following example:

int i = 1;
while(i < 5) {
    cout << i << endl;
    // i++; => forgot this
}

In this example, the variable i is never incremented, so the condition i < 5 always remains true, resulting in an infinite loop.

Main Concepts

To avoid infinite loops, it is essential to ensure that the loop's condition will eventually become false. This usually involves updating a variable within the loop body that affects the loop's condition.

Here is a corrected version of the previous example:

int i = 1;
while(i < 5) {
    cout << i << endl;
    i++; // Increment i to eventually break the loop
}

In this corrected version, the variable i is incremented in each iteration, ensuring that the condition i < 5 will eventually become false, and the loop will terminate.

Examples and Use Cases

Let's look at a few more examples to solidify our understanding:

Example 1: Counting Down

int i = 10;
while(i > 0) {
    cout << i << endl;
    i--; // Decrement i to eventually break the loop
}

In this example, the loop counts down from 10 to 1 and then terminates.

Example 2: User Input

int number;
cout << "Enter a number (0 to exit): ";
cin >> number;
while(number != 0) {
    cout << "You entered: " << number << endl;
    cout << "Enter another number (0 to exit): ";
    cin >> number;
}

This example continues to prompt the user for input until they enter 0, at which point the loop terminates.

Common Pitfalls and Best Practices

Here are some common mistakes to avoid when working with loops:

Best practices include:

Advanced Techniques

In more complex scenarios, you might use nested loops or loops with multiple exit conditions. Here is an example of a nested loop:

for(int i = 0; i < 3; i++) {
    for(int j = 0; j < 3; j++) {
        cout << "i: " << i << ", j: " << j << endl;
    }
}

This example demonstrates a nested loop where the inner loop runs completely for each iteration of the outer loop.

Code Implementation

Let's implement a simple program that demonstrates the correct use of a while loop:

#include <iostream>
using namespace std;

int main() {
    int i = 1;
    while(i <= 5) {
        cout << "Iteration: " << i << endl;
        i++; // Ensure the loop will terminate
    }
    return 0;
}

This program will print the numbers 1 to 5, demonstrating a properly controlled while loop.

Debugging and Testing

When debugging loops, consider the following tips:

Writing tests for loops involves checking that the loop terminates as expected and produces the correct output. Here is an example test case:

#include <iostream>
#include <cassert>
using namespace std;

void testLoop() {
    int i = 1;
    int sum = 0;
    while(i <= 5) {
        sum += i;
        i++;
    }
    assert(sum == 15); // 1 + 2 + 3 + 4 + 5 = 15
}

int main() {
    testLoop();
    cout << "All tests passed!" << endl;
    return 0;
}

Thinking and Problem-Solving Tips

When approaching problems involving loops, consider the following strategies:

Conclusion

In this lesson, we covered the concept of infinite while loops in C++ and how to avoid them. We discussed the importance of ensuring that loop conditions will eventually become false and provided examples and best practices for writing efficient loops. By mastering these concepts, you can write more reliable and maintainable code.

Additional Resources

For further reading and practice, consider the following resources: