[Courses] C Programming For Absolute Beginners, A note about indentation
Jacinta Richardson
jarich at perltraining.com.au
Mon Mar 12 00:39:00 UTC 2012
G'day folk,
I'm just going to hijack Carla's course for a moment to talk to you about the
single best programming practice you can have. Oh there are lots of good
programming practices that you should follow, but if there had to be a single
most important one, it'd have to be indentation.
Indentation is a wonderful thing.
Much more important than coding for efficiency. Much more important even than
designing your code before you write it, or picking good variable names. (Both
of which are also pretty much essential.) Good indentation will help you find
bugs faster, and add fewer bugs into your code.
There are two kinds of indentation. Vertical indentation - where we add
newlines after each semi-colon/statement and preferably a blank line between
code ideas, and you're all pretty good at this. And Horizontal indentation,
where we add extra whitespace in front of each statement each time we start a
block, and some of you do not have the hang of this yet.
So, here are some examples.
This is my example from earlier with as little whitespace as I think I can get
away with:
// loopy, getting looped in C! with more!
#include<stdio.h>
int main (){int a=0;int
total=0;for(a=1;a<=50;a=a+1){total=total+a;printf("My running total is:
%i\n",total);}printf("The sum of this loop is %i\n",total);return 0;}
It compiles and runs just fine. But ew. Very hard to read.
Here I've adding newlines, but nothing else.
// loopy, getting looped in C! with more!
#include<stdio.h>
int main (){
int a=0;
int total=0;
for(a=1;a<=50;a=a+1){
total=total+a;
printf("My running total is: %i\n",total);
}
printf("The sum of this loop is %i\n",total);
return 0;
}
Again, it compiles and runs just fine. None of your code is quite as bad as
this. Notice that we have two close curly braces in the same column. This is
confusing. We have to go and actually read the code to see if the first one is
closing main() or whether the second one closes main and the first one closes a
loop or conditional.
Here I've added basic indentation. 4 spaces per block, before each statement:
// loopy, getting looped in C! with more!
#include<stdio.h>
int main (){
int a=0;
int total=0;
for(a=1;a<=50;a=a+1){
total=total+a;
printf("My running total is: %i\n",total);
}
printf("The sum of this loop is %i\n",total);
return 0;
}
Again this compiles and runs just fine. Now we can see that the final close
curly brace closes the main() statement, because if we run our eyes up the
column it's in, we "bump our head" on the i in "int main". Likewise, at a
glance, we can see that the second close curly brace closes the for() loop
because if we run our eyes up the column its in we bump our head on the f in "for".
This code has the minimal amount of indentation we can afford to have. If we
were to forget to add one of those curlies, our code would look wrong. We
should never change an indentation level without an open or close curly (except
if we're taking advantage of not needing braces for single statement
loops/conditionals, but I don't recommend that).
We can now add some more whitespace to make the code look nice. Here I'm
adding some blank lines to break the code up into paragraphs. Inside the main
function my paragraphs are:
* initialise some variables
* calculate and print some values (in the for loop and after)
* return:
I've also added some whitespace around assignments, and function calls where I
think it makes the code nicer to read.
// loopy, getting looped in C! with more!
#include <stdio.h>
int main () {
int a = 0;
int total = 0;
for( a = 1; a <= 50; a = a+1 ) {
total= total + a;
printf("My running total is: %i\n", total);
}
printf("The sum of this loop is %i\n", total);
return 0;
}
If I were to have if() statements in my code above, they'd be treated just the
same way as that for loop. eg
for( a = 1; a <= 50; a = a+1 ) {
total= total + a;
/* Only print every 5th line (starting at 1) */
if( a % 5 == 1 ) {
printf("My running total at line %2d is: %4i\n", a, total);
}
}
In the above examples I've used K&R style bracing (where the open brace goes on
the same line as the statement that is opening the block). Carla has been
demonstrating with gnu-style bracing (where the open brace goes under the first
column of the statement that is opening the block). Both styles have the close
brace directly under the first column of the statement that opened the bloc.
The full code in gnu-style (including that last if statement) looks like this:
// loopy, getting looped in C! with more!
#include <stdio.h>
int main ()
{
int a = 0;
int total = 0;
for( a = 1; a <= 50; a = a+1 )
{
total= total + a;
if(a % 5 == 1)
{
printf("My running total at line %2d is: %4i\n", a, total);
}
}
printf("The sum of this loop is %i\n", total);
return 0;
}
Either style is correct, unless you're working with pre-existing code, then the
correct choice is to use whatever they've already been using. So pick the style
you prefer, but use it consistently, and remember to indent each line inside a
block.
HOMEWORK: Correct the indentation on one of your previous exercises.
J
More information about the Courses
mailing list