5.10. Local variables

About this time, you might be wondering how we can use the same variable i in both print_multiples and multiples_table. Didn't I say that you can only declare a variable once? And doesn't it cause problems when one of the functions changes the value of the variable?

The answer to both questions is "no," because the i in print_multiples and the i in multiples_table are not the same variable. They have the same name, but they do not refer to the same storage location, and changing the value of one of them has no effect on the other.

Note

Remember that variables that are declared inside a function definition are local. You cannot access a local variable from outside its "home" function, and you are free to have multiple variables with the same name, as long as they are not in the same function scope.

The stack diagram for this program shows clearly that the two variables named i are not in the same storage location. They can have different values, and changing one does not affect the other.

stack diagram showing local variables in the multiples table call stack

Fig. 5.1 Stack diagram for multiples table

Notice that the value of the parameter n in print_multiples has to be the same as the value of i in multiples_table. On the other hand, the value of i in print_multiples goes from 1 up to n. In Fig. 5.1, it happens to be 3. The next time through the loop it will be 4.

It may be a good idea to use different variable names in different functions, to avoid confusion, but there are good reasons to reuse names. For example, it is common to use the names i, j and k as loop variables. If you avoid using them in one function just because you used them somewhere else, you will probably make the program harder to read.

Q1

Are there any issues with the code below?

#include <iostream>
using namespace std;

int main() {
  cout << "Let's print the multiples of 2." << '\n';
  int i = 1;
  while (i < 10) {
    int j = i * 2;
    cout << i << ": " << j << '\n';
    i++;
  }
  i = 10;
  j = 20;
  cout << i << ": " << j << '!';
}

Q2

Take a look at the code below. Is the i in print_multiples the same variable as the i in print_mult_table?

#include <iostream>
using namespace std;

void print_multiples (int n) {
  int i = 1;
  while (i <= 6) {
    cout << n * i << '\t';
    i = i + 1;
  }
  cout << '\n';
}

void print_mult_table() {
  int i = 1;
  while (i <= 6) {
    print_multiples (i);
    i = i + 1;
  }
}

int main() {
  print_mult_table();
}

Q3

Take a look at the code below. Is the variable j accessable in the function print_multiples?

#include <iostream>
using namespace std;

void print_multiples (int n) {
  int i = 1;
  while (i <= 6) {
    cout << n * i << '\t';
    i = i + 1;
  }
  cout << '\n';
}

void print_mult_table() {
  int j = 1;
  while (j <= 6) {
    print_multiples (j);
    j = j + 1;
  }
}

int main() {
  print_mult_table();
}