Practical C Programming, 3rd Edition (2011)
Part III. Advanced Programming Concepts
Chapter 21. C’s Dustier Corners
There be of them that have left a name behind them.
—Ecclesiasticus 44:8
This chapter describes the few remaining features of C that have not been described in any of the previous chapters. It is titled C’s Dustier Corners because these statements are hardly ever used in real programming.
do/while
The do/while statement has the following syntax:
do {statement
statement
} while (expression);
The program will loop, test the expression, and stop if the expression is false (0).
NOTE
This construct will always execute at least once.
do/while is not frequently used in C. Most programmers prefer to use a while/break combination.
goto
Every sample program in this book was coded without using a single goto. In actual practice, I find a goto statement useful about once every other year.
For those rare times that a goto is necessary, the correct syntax is:
gotolabel;
where label is a statement label. Statement labels follow the same naming convention as variable names. Labeling a statement is done as follows:
label:statement
For example:
for (x = 0; x < X_LIMIT; x++) {
for (y = 0; y < Y_LIMIT; y++) {
if (data[x][y] == 0)
goto found;
}
}
printf("Not found\n");
exit(8);
found:
printf("Found at (%d,%d)\n", x, y);
Question 21-1: Why does Example 21-1 not print an error message when an incorrect command is entered?
Hint: We put this in the goto section. (Click here for the answer Section 21.6)
Example 21-1. def/def.c
#include <stdio.h>
#include <stdlib.h>
int main()
{
char line[10];
while (1) {
printf("Enter add(a), delete(d), quit(q): ");
fgets(line, sizeof(line), stdin);
switch (line[0]) {
case 'a':
printf("Add\n");
break;
case 'd':
printf("Delete\n");
break;
case 'q':
printf("Quit\n");
exit(0);
defualt:
printf("Error:Bad command %c\n", line[0]);
break;
}
}
}
The ?: Construct
The question mark (?) and colon (:) operators work in a manner similar to that of if/then/else. Unlike if/then/else, the ?: construct can be used inside of an expression. The general form of ?: is:
(expression) ? value1 :value2
For example, the following construct assigns to amount_owed the value of the balance or zero, depending on the amount of the balance:
amount_owed = (balance < 0) ? 0 : balance;
The following macro returns the minimum of its two arguments:
#define min(x,y) ((x) < (y) ? (x) : (y))
The , Operator
The comma (,) operator can be used to group statements. For example:
if (total < 0) {
printf("You owe nothing\n");
total = 0;
}
can be written as:
if (total < 0)
printf("You owe nothing\n"),total = 0;
In most cases, curly braces ({}) should be used instead of a comma. About the only place the comma operator is useful is in a for statement. The following for loop increments two counters, two and three, by 2 and 3:
for (two = 0, three = 0;
two < 10;
two += 2, three += 3)
printf("%d %d\n", two, three);
volatile Qualifier
The volatile keyword is used to indicate a variable whose value might change at any moment. The keyword is used for variables such as memory-mapped I/O devices or in real-time control applications where variables can be changed by an interrupt routine.
Things like memory-mapped device drivers, interrupt routines, and real-time control are extremely advanced subjects. You will be programming at a level far beyond the scope of this book before you will need to use the volatile keyword.
Answer
Answer 21-1: The compiler didn’t see our default line because we misspelled “default” as “defualt.” This mistake was not flagged as an error because “defualt:” is a valid goto label.