I.1: What is a local block?
Answer:
- A local block is any portion of a C program that is enclosed by the left brace ({) and the right brace (}).
- A C function contains left and right braces, and therefore anything between the two braces is contained in a local block.
- An if statement or a switch statement can also contain braces, so the portion of code between these two braces would be considered a local block.
- Additionally, you might want to create your own local block without the aid of a C function or keyword construct. This is perfectly legal.
- Variables can be declared within local blocks, but they must be declared only at the beginning of a local block. Variables declared in this manner are visible only within the local block.
- Duplicate variable names declared within a local block take precedence over variables with the same name declared outside the local block.
- Here is an example of a program that uses local blocks:
#include <stdio.h>
void main(void);
void main()
{
/* Begin local block for function main() */
int test_var = 10;
printf("Test variable before the if statement: %d\n", test_var);
if (test_var > 5)
{
/* Begin local block for "if" statement */
int test_var = 5;
printf("Test variable within the if statement: %d\n",test_var);
{
/* Begin independent local block (not tied to
any function or keyword) */
int test_var = 0;
printf(
"Test variable within the independent local block:%d\n",test_var);
}
/* End independent local block */
}
/* End local block for "if" statement */
printf("Test variable after the if statement: %d\n", test_var);
}
/* End local block for function main() */
- This example program produces the following output:
Test variable before the if statement: 10
Test variable within the if statement: 5
Test variable within the independent local block: 0
Test variable after the if statement: 10
- Notice that as each test_var was defined, it took precedence over the previously defined test_var. Also notice that when the if statement local block had ended, the program had reentered the scope of the original test_var, and its value was 10.
I.2: Should variables be stored in local blocks?
Answer:
- The use of local blocks for storing variables is unusual and therefore should be avoided, with only rare exceptions.
- One of these exceptions would be for debugging purposes, when you might want to declare a local instance of a global variable to test within your function.
- You also might want to use a local block when you want to make your program more readable in the current context.
- Sometimes having the variable declared closer to where it is used makes your program more readable.
- However, well-written programs usually do not have to resort to declaring variables in this manner, and you should avoid using local blocks.
I.3: When is a switch statement better than multiple if statements?
Answer:
- A switch statement is generally best to use when you have more than two conditional expressions based on a single variable of numeric type.
- For instance, rather than the code
if (x == 1)
printf("x is equal to one.\n");
else if (x == 2)
printf("x is equal to two.\n");
else if (x == 3)
printf("x is equal to three.\n");
else
printf("x is not equal to one, two, or three.\n");
- the following code is easier to read and maintain:
switch (x)
{
case 1: printf("x is equal to one.\n");
break;
case 2: printf("x is equal to two.\n");
break;
case 3: printf("x is equal to three.\n");
break;
default: printf("x is not equal to one, two, or three.\n");
break;
}
- the following code is easier to read and maintain:
- Notice that for this method to work, the conditional expression must be based on a variable of numeric type in order to use the switch statement.
- Also, the conditional expression must be based on a single variable.
- For instance, even though the following if statement contains more than two conditions, it is not a candidate for using a switch statement because it is based on string comparisons and not numeric comparisons:
char* name = "Lupto";
if (!stricmp(name, "Isaac"))
printf("Your name means 'Laughter'.\n");
else if (!stricmp(name, "Amy"))
printf("Your name means 'Beloved'.\n ");
else if (!stricmp(name, "Lloyd"))
printf("Your name means 'Mysterious'.\n ");
else
printf("I haven't a clue as to what your name means.\n");
I.4: Is a default case necessary in a switch statement?
Answer:
- No, but it is not a bad idea to put default statements in switch statements for error- or logic-checking purposes.
- For instance, the following switch statement is perfectly normal:
switch (char_code)
{
case 'Y':
case 'y': printf("You answered YES!\n");
break;
case 'N':
case 'n': printf("You answered NO!\n");
break;
}
- Consider, however, what would happen if an unknown character code were passed to this switch statement.
- The program would not print anything. It would be a good idea, therefore, to insert a default case where this condition would be taken care of:
default: printf("Unknown response: %d\n", char_code);
break;
- Additionally, default cases come in handy for logic checking.
- For instance, if your switch statement handled a fixed number of conditions and you considered any value outside those conditions to be a logic error, you could insert a default case which would flag that condition.
- Consider the following example:
void move_cursor(int direction)
{
switch (direction)
{
case UP: cursor_up();
break;
case DOWN: cursor_down();
break;
case LEFT: cursor_left();
break;
case RIGHT: cursor_right();
break;
default: printf("Logic error on line number %ld!!!\n",__LINE__);
break;
}
}