2. THE PRINCIPAL STRUCTURE OF A PROGRAM 9
. getting-started.c
5 /* The main thing that this prog ram does . */
Comments are ignored by the compiler. It is the perfect place to explain
and document your code. Such in-place documentation can (and should) greatly
improve the readability and comprehensibility of your code. Another form of
comment is the so-called C++-style comment, as on line 15. These are marked
with //. C++-style comments extend from the // to the end of the line.
Literals
C
: Our program contains several items that refer to fixed values that are part of the
program: 0, 1, 3, 4, 5, 9.0, 2.9, 3.E+25, .00007, and
"element␣%zu␣is␣%g,␣\tits␣square␣is␣%g\n". These are called literals
C
.
Identifiers
C
: These are “names” that we (or the C standard) give to certain entities in
the program. Here we have A, i, main, printf, size_t, and EXIT_SUCCESS.
Identifiers can play different roles in a program. Among other things, they may
refer to
• Data objects
C
(such as A and i). These are also referred to as variables
C
.
• Type
C
aliases, such as size_t, that specify the “sort” of a new object, here
of i. Observe the trailing _t in the name. This naming convention is used
by the C standard to remind you that the identifier refers to a type.
• Functions, such as main and printf.
• Constants, such as EXIT_SUCCESS.
Functions
C
: Two of the identifiers refer to functions: main and printf. As we have al-
ready seen, printf is used by the program to produce some output. The function
main in turn is defined
C
: that is, its declaration
C
int main(void) is followed
by a block
C
enclosed in { ... } that describes what that function is supposed
to do. In our example, this function definition
C
goes from line 6 to 24. main has
a special role in C programs, as we will encounter: it must always be present,
since it is the starting point of the program’s execution.
Operators
C
: Of the numerous C operators, our program only uses a few:
• = for initialization
C
and assignment
C
,
• < for comparison,
• ++ to increment a variable (to increase its value by 1), and
• * to multiply two values.
Just as in natural languages, the lexical elements and the grammar of C programs that
we have seen here have to be distinguished from the actual meaning these constructs con-
vey. In contrast to natural languages, though, this meaning is rigidly specified and usually
leaves no room for ambiguity. In the following subsections, we will dig into the three main
semantic categories that C distinguishes: declarations, definitions, and statements.
2.2. Declarations. Before we may use a particular identifier in a program, we have to
give the compiler a declaration
C
that specifies what that identifier is supposed to represent.
This is where identifiers differ from keywords: keywords are predefined by the language
and must not be declared or redefined.
Takeaway 0.2.2.1
All identifiers in a program have to be declared.
Three of the identifiers we use are effectively declared in our program: main, A, and
i. Later on, we will see where the other identifiers (printf, size_t, and EXIT_SUCCESS)
come from. We already mentioned the declaration of the main function. All three declara-
tions, in isolation as “declarations only,” look like this:
int main ( void ) ;
do ub le A [5];
si ze _t i ;