Skip to main content
Commonmark migration
Source Link

#Swapping the values of two variables

Swapping the values of two variables

#Swapping the values of two variables

Swapping the values of two variables

Post Closed as "Duplicate" by Arseni Mourzenko, Dan Pichelman, user40980
for (int i = 0; i < 100; ++i) {
    int value = function(i); // Here 'x'value' is local to this block
    printf("function(%d) == %d\n", i, value);
}
for (int i = 0; i < 100; ++i) {
    int value = function(i); // Here 'x is local to this block
    printf("function(%d) == %d\n", i, value);
}
for (int i = 0; i < 100; ++i) {
    int value = function(i); // Here 'value' is local to this block
    printf("function(%d) == %d\n", i, value);
}
Notice added Needs detailed answers by Thomas Owens
Question Protected by Thomas Owens
Post Reopened by Thomas Owens
Post Closed as "Needs more focus" by Mason Wheeler, gnat, user22815
Tweeted twitter.com/StackProgrammer/status/664104513729634304
Source Link
wefwefa3
  • 1k
  • 3
  • 12
  • 21

Using compound statements ("{" ... "}" blocks) to enforce variable locality

Introduction

Many "C-like" programming languages use compound statements (code blocks specified with "{" and "}") to define a variables scope.

Here is a simple example.

for (int i = 0; i < 100; ++i) {
    int value = function(i); // Here 'x is local to this block
    printf("function(%d) == %d\n", i, value);
}

This is good because it limits the scope of the value to where it is used. It is hard for programmers to use value in ways that they are not meant to because they can only access it from within its scope.

I am almost all of you are aware of this and agree that it is good practice to declare variables in the block they are used to limit their scope.

But even though it is an established convention to declare variables in their smallest possible scope it is not very common to use an naked compound statement (that is an compound statement that is not connected to an if, for, while statement).

#Swapping the values of two variables

Programmers often write the code like this:

int x = ???
int y = ???

// Swap `x` and `y`
int tmp = x;
x = y;
y = tmp;

Would it not be better to write the code like this:

int x = ???
int y = ???

// Swap `x` and `y`
{
    int tmp = x;
    x = y;
    y = tmp;
}

It looks quite ugly but I think that this is a good way to enforce variable locality and make the code safer to use.

This does not only apply to temporaries

I often see similar patterns where a variable is used once in a function

Object function(ParameterType arg) {
    Object obj = new Object(obj);
    File file = File.open("output.txt", "w+");
    file.write(obj.toString());

    // `obj` is used more here but `file` is never used again.
    ...
}

Why don't we write it like this?

RET_TYPE function(PARAM_TYPE arg) {
    Object obj = new Object(obj);
    {
       File file = File.open("output.txt", "w+");
       file.write(obj.toString());
    }

    // `obj` is used more here but `file` is never used again.
    ...
}

Summary of question

It is hard to come up with good examples. I am sure that there are betters ways to write the code in my examples but that is not what this question is about.

My question is why we do not use "naked" compound statements more to limit the scope of variables.

What do you think about using a compound statement like this

{
    int tmp = x;
    x = y;
    y = z;
}

to limit the scope of tmp?

Is it good practice? Is it bad practice? Explain your thoughts.