C Syntax
C Syntax
The char type is distinct from both signed char and unsigned char, but is guaranteed to have the same representation as one of them. The _Bool and long long types
are standardized since 1999, and may not be supported
by older C compilers. Type _Bool is usually accessed
via the typedef name bool dened by the standard header
stdbool.h.
Data structures
1.1
In general, the widths and representation scheme implemented for any given platform are chosen based on the
machine architecture, with some consideration given to
the ease of importing source code developed for other
platforms. The width of the int type varies especially
widely among C implementations; it often corresponds
to the most natural word size for the specic platform.
The standard header limits.h denes macros for the minimum and maximum representable values of the standard
integer types as implemented on any specic platform.
The C language represents numbers in three forms: integral, real and complex. This distinction reects similar distinctions in the instruction set architecture of most
central processing units. Integral data types store numbers in the set of integers, while real and complex numbers represent numbers (or pair of numbers) in the set of
real numbers in oating point form.
Integer constants may be specied in source code in several ways. Numeric values can be specied as decimal
(example: 1022), octal with zero (0) as a prex (01776),
or hexadecimal with 0x (zero x) as a prex (0x3FE). A
character in single quotes (example: 'R'), called a character constant, represents the value of that character in
the execution character set, with type int. Except for
character constants, the type of an integer constant is determined by the width required to represent the specied
value, but is always at least as wide as int. This can be
overridden by appending an explicit length and/or signedness modier; for example, 12lu has type unsigned long.
There are no negative integer constants, but the same effect can often be obtained by using a unary negation operator "-".
Integer types
2
1.1.2
1
Enumerated type
The enumerated type in C, specied with the enum keyword, and often just called an enum (usually pronounced ee'-num /i.nm/ or ee'-noom /i.num/), is a type
designed to represent values across a series of named constants. Each of the enumerated constants has type int.
Each enum type itself is compatible with char or a signed
or unsigned integer type, but each implementation denes
its own rules for choosing a type.
Some compilers warn if an object with enumerated type
is assigned a value that is not one of its constants. However, such an object can be assigned any values in the
range of their compatible type, and enum constants can
be used anywhere an integer is expected. For this reason,
enum values are often used in place of preprocessor #dene directives to create named constants. Such constants
are generally safer to use than macros, since they reside
within a specic identier namespace.
An enumerated type is declared with the enum specier
and an optional name (or tag) for the enum, followed by a
list of one or more constants contained within curly braces
and separated by commas, and an optional list of variable
names. Subsequent references to a specic enumerated
type use the enum keyword and the name of the enum.
By default, the rst constant in an enumeration is assigned
the value zero, and each subsequent value is incremented
by one over the previous constant. Specic values may
also be assigned to constants in the declaration, and any
subsequent constants without specic values will be given
incremented values from that point onward. For example,
consider the following declaration:
enum colors { RED, GREEN, BLUE = 5, YELLOW }
paint_color;
This declares the enum colors type; the int constants RED
(whose value is 0), GREEN (whose value is one greater
than RED, 1), BLUE (whose value is the given value, 5),
and YELLOW (whose value is one greater than BLUE,
6); and the enum colors variable paint_color. The constants may be used outside of the context of the enum
(where any integer value is allowed), and values other
than the constants may be assigned to paint_color, or any
other variable of type enum colors.
DATA STRUCTURES
Floating-point constants may be written in decimal notation, e.g. 1.23. Scientic notation may be used by
adding e or E followed by a decimal exponent, e.g. 1.23e2
(which has the value 123.0). Either a decimal point or
an exponent is required (otherwise, the number is parsed
as an integer constant). Hexadecimal oating-point constants follow similar rules, except that they must be prexed by 0x and use p or P to specify a binary exponent,
e.g. 0xAp-2 (which has the value 2.5, since 10 22 = 10
4). Both decimal and hexadecimal oating-point constants may be suxed by f or F to indicate a constant of
type oat, by l (letter l) or L to indicate type long double,
or left unsuxed for a double constant.
The standard header le oat.h denes the minimum and
maximum values of the implementations oating-point
types oat, double, and long double. It also denes other
limits that are relevant to the processing of oating-point
numbers.
1.1.4 Storage class speciers
Every object has a storage class. This species most basically the storage duration, which may be static (default
for global), automatic (default for local), or dynamic (allocated), together with other features (linkage and register hint).
1
Variables declared within a block by default have automatic storage, as do those explicitly declared with the
auto[2] or register storage class speciers. The auto and
register speciers may only be used within functions and
function argument declarations; as such, the auto specier is always redundant. Objects declared outside of all
blocks and those explicitly declared with the static storage
class specier have static storage duration. Static variables are initialized to zero by default by the compiler.
1.3
Pointers
1.2
Incomplete types
1.3.1 Referencing
When a non-static pointer is declared, it has an unspecied value associated with it. The address associated with
such a pointer must be changed by assignment prior to using it. In the following example, ptr is set so that it points
to the data associated with the variable a:
int *ptr; int a; ptr = &a;
In order to accomplish this, the address-of operator
(unary &) is used. It produces the memory location of
the data object that follows.
1.3.2 Dereferencing
1.4 Arrays
1.4.1 Array denition
Incomplete types are used to implement recursive struc- Arrays are used in C to represent structures of consecutures; the body of the type declaration may be deferred tive elements of the same type. The denition of a (xedsize) array has the following syntax:
to later in the translation unit:
typedef struct Bert Bert; typedef struct Wilma Wilma; int array[100];
struct Bert { Wilma *wilma; }; struct Wilma { Bert
1.4.2
Accessing elements
DATA STRUCTURES
The primary facility for accessing the values of the elements of an array is the array subscript operator. To
access the i-indexed element of array, the syntax would
be array[i], which refers to the value stored in that array
element.
Variable-length arrays
1.5
Strings
1.5
Strings
Backslash escapes
Backslashes may be used to enter control characters, etc., width for wchar_t, leaving the choice to the implemen-
DATA STRUCTURES
Unions in C are related to structures and are dened as objects that may hold (at dierent times) objects of dierent types and sizes. They are analogous to variant records
in other programming languages. Unlike structures, the
components of a union all refer to the same location in
memory. In this way, a union can be used at various times
to hold dierent types of objects, without the need to create a separate object for each new type. The size of a
The now generally recommended method[5] of supporting union is equal to the size of its largest component type.
international characters is through UTF-8, which is stored
in char arrays, and can be written directly in the source 1.6.3 Declaration
code if using a UTF-8 editor, because UTF-8 is a direct
ASCII extension.
Structures are declared with the struct keyword and
1.5.5
A common alternative to wchar_t is to use a variablewidth encoding, whereby a logical character may extend over multiple positions of the string. Variable-width
strings may be encoded into literals verbatim, at the risk
of confusing the compiler, or using numerical backslash
escapes (e.g. "\xc3\xa9 for "" in UTF-8). The UTF8 encoding was specically designed (under Plan 9) for
compatibility with the standard library string functions;
supporting features of the encoding include a lack of embedded nulls, no valid interpretations for subsequences,
and trivial resynchronisation. Encodings lacking these
features are likely to prove incompatible with the standard library functions; encoding-aware string functions
are often used in such cases.
unions are declared with the union keyword. The specier keyword is followed by an optional identier name,
which is used to identify the form of the structure or
union. The identier is followed by the declaration of
the structure or unions body: a list of member declarations, contained within curly braces, with each declaration terminated by a semicolon. Finally, the declaration
concludes with an optional list of identier names, which
are declared as instances of the structure or union.
For example, the following statement declares a structure
named s that contains three members; it will also declare
an instance of the structure known as tee:
struct s { int x; oat y; char *z; } tee;
And the following statement will declare a similar union
named u and an instance of it named n:
union u { int x; oat y; char *z; } n;
1.5.6
Library functions
Members of structures and unions cannot have an incomStrings, both constant and variable, can be manipulated plete or function type. Thus members cannot be an inwithout using the standard library. However, the library stance of the structure or union being declared (because
contains many useful functions for working with null- it is incomplete at that point) but can be pointers to the
type being declared.
terminated strings.
1.6
1.6.1
1.6
the need for the struct or union keyword in later references to the structure. The rst identier after the body
of the structure is taken as the new name for the structure type (structure instances may not be declared in this
context). For example, the following statement will declare a new type known as s_type that will contain some
structure:
7
1.6.5 Assignment
Assigning values to individual members of structures and
unions is syntactically identical to assigning values to any
other object. The only dierence is that the lvalue of the
assignment is the name of the member, as accessed by the
syntax mentioned above.
A structure can also be assigned as a unit to another structure of the same type. Structures (and pointers to strucFuture statements can then use the specier s_type (in- tures) may also be used as function parameter and return
stead of the expanded struct specier) to refer to the types.
structure.
For example, the following statement assigns the value of
74 (the ASCII code point for the letter 't') to the member
named x in the structure tee, from above:
tee.x = 74;
1.6.4
Accessing members
ptr_to_tee->x = 74;
Members are accessed using the name of the instance of
a structure or union, a period (.), and the name of the
member. For example, given the declaration of tee from Assignment with members of unions is identical.
above, the member known as y (of type oat) can be accessed using the following syntax:
1.6.6 Other operations
tee.y
According to the C standard, the only legal operations
Structures are commonly accessed through pointers. that can be performed on a structure are copying it, asConsider the following example that denes a pointer to signing to it as a unit (or initializing it), taking its address
tee, known as ptr_to_tee:
with the address-of (&) unary operator, and accessing its
members. Unions have the same restrictions. One of the
struct s *ptr_to_tee = &tee;
operations implicitly forbidden is comparison: structures
and unions cannot be compared using Cs standard comMember y of tee can then be accessed by dereferencing parison facilities (==, >, <, etc.).
ptr_to_tee and using the result as the left operand:
(*ptr_to_tee).y
Which is identical to the simpler tee.y above as long
as ptr_to_tee points to tee. Due to operator precedence
(". being higher than "*"), the shorter *ptr_to_tee.y
is incorrect for this purpose, instead being parsed as
*(ptr_to_tee.y) and thus the parentheses are necessary. Because this operation is common, C provides an
abbreviated syntax for accessing a member directly from
a pointer. With this syntax, the name of the instance is
replaced with the name of the pointer and the period is
replaced with the character sequence ->. Thus, the following method of accessing y is identical to the previous
two:
ptr_to_tee->y
Members of unions are accessed in the same way.
OPERATORS
1.7
Initialization
1.7.1
Designated initializers
3.3
Iteration statements
Control structures
Selection statements
C has two types of selection statements: the if statement do <statement> while ( <expression> ) ; while ( <expression> ) <statement> for ( <expression> ; <expression> ;
and the switch statement.
<expression> ) <statement>
The if statement is in the form:
if (<expression>) <statement1> else <statement2>
In the while and do statements, the sub-statement is executed repeatedly so long as the value of the expression remains non-zero (equivalent to true). With while, the test,
including all side eects from <expression>, occurs before each iteration (execution of <statement>); with do,
the test occurs after each iteration. Thus, a do statement
always executes its sub-statement at least once, whereas
while may not execute the sub-statement at all.
is equivalent to:
e1; while (e2) { s; cont: e3; }
except for the behaviour of a continue; statement (which
in the for loop jumps to e3 instead of e2). If e2 is blank,
it would have to be replaced with a 1.
switch (<expression>) { case <label1> : <statements Any of the three expressions in the for loop may be omit1> case <label2> : <statements 2> break; default : ted. A missing second expression makes the while test
always non-zero, creating a potentially innite loop.
<statements 3> }
Since C99, the rst expression may take the form of a
No two of the case constants associated with the same declaration, typically including an initializer, such as:
switch may have the same value. There may be at most for (int i = 0; i < limit; ++i) { // ... }
10
4 FUNCTIONS
4.1 Syntax
The declarations scope is limited to the extent of the for
A C function denition consists of a return type (void if
loop.
no value is returned), a unique name, a list of parameters
in parentheses, and various statements:
3.4
Jump statements
It is possible to dene a function as taking a variable number of parameters by providing the ... keyword as the last
parameter instead of a data type and variable identier.
A commonly used function that does this is the standard
library function printf, which has the declaration:
3.4.1
<return-type> (*<function-name>)(<parameter-list>);
The following program shows use of a function pointer
for selecting between addition and subtraction:
#include <stdio.h> int (*operation)(int x, int y); int
add(int x, int y) { return x + y; } int subtract(int x, int y)
{ return x - y; } int main(int argc, char* args[]) { int foo
= 1, bar = 1; operation = add; printf("%d + %d = %d\n,
foo, bar, operation(foo, bar)); operation = subtract;
printf("%d - %d = %d\n, foo, bar, operation(foo, bar));
return 0; }
Functions
Global structure
After preprocessing, at the highest level a C program consists of a sequence of declarations at le scope. These
may be partitioned into several separate source les,
which may be compiled separately; the resulting object modules are then linked along with implementationprovided run-time support modules to produce an executable image.
The declarations introduce functions, variables and types.
4.3
Argument passing
11
C functions are akin to the subroutines of Fortran or the A function may return a value to caller (usually another
procedures of Pascal.
C function, or the hosting environment for the function
A denition is a special type of declaration. A variable main). The printf function mentioned above returns how
denition sets aside storage and possibly initializes it, a many characters were printed, but this value is often ignored.
function denition provides its body.
An implementation of C providing all of the standard library functions is called a hosted implementation. Pro- 4.3 Argument passing
grams written for hosted implementations are required to
dene a special function called main, which is the rst In C, arguments are passed to functions by value while
function called when execution of the program begins.
other languages may pass variables by reference. This
Hosted implementations start program execution by in- means that the receiving function gets copies of the valvoking the main function, which must be dened follow- ues and has no direct way of altering the original variables. For a function to alter a variable passed from aning one of these prototypes:
other function, the caller must pass its address (a pointer
int main() {...} int main(void) {...} int main(int argc,
to it), which can then be dereferenced in the receiving
char *argv[]) {...} int main(int argc, char **argv) {...}
function. See Pointers for more information.
The rst two denitions are equivalent (and both are compatible with C++). It is probably up to individual preference which one is used (the current C standard contains
two examples of main() and two of main(void), but the
draft C++ standard uses main()). The return value of
main (which should be int) serves as termination status
returned to the host environment.
The C standard denes return values 0
and
EXIT_SUCCESS
as
indicating
success
and
EXIT_FAILURE
as
indicating
failure.
(EXIT_SUCCESS and EXIT_FAILURE are dened in
<stdlib.h>). Other return values have implementationdened meanings; for example, under Linux a program
killed by a signal yields a return code of the numerical
value of the signal plus 128.
#include <stdio.h> #include <stdlib.h> void allocate_array(int ** const a_p, const int A) { /* allocate
array of A ints assigning to *a_p alters the 'a' in main() */
*a_p = malloc(sizeof(int) * A); } int main(void) { int *
A minimal correct C program consists of an empty main a; /* create a pointer to one or more ints, this will be the
routine, taking no arguments and doing nothing:
array */ /* pass the address of 'a' */ allocate_array(&a,
42); /* 'a' is now an array of length 42 and can be
int main(void){}
manipulated and freed here */ free(a); return 0; }
Because no return statement is present, main returns 0 on
exit.[3] (This is a special-case feature introduced in C99 The parameter int **a_p is a pointer to a pointer to an
int, which is the address of the pointer p dened in the
that applies only to main.)
main function in this case.
The main function will usually call other functions to help
it perform its job.
Some implementations are not hosted, usually because
they are not intended to be used with an operating system. Such implementations are called free-standing in
the C standard. A free-standing implementation is free
to specify how it handles program startup; in particular it
need not require a program to dene a main function.
Functions may be written by the programmer or provided by existing libraries. Interfaces for the latter are
usually declared by including header leswith the #include preprocessing directiveand the library objects
are linked into the nal executable image. Certain library
functions, such as printf, are dened by the C standard;
these are referred to as the standard library functions.
12
5 MISCELLANEOUS
ceding declaration of setArray is equivalent to the follow- // this line will be ignored by the compiler /* these lines
ing:
will be ignored by the compiler */ x = *p/*q; /* this
comment starts after the 'p' */
void setArray(int *array, int index, int value)
At the same time, C rules for the use of arrays in expressions cause the value of a in the call to setArray to
be converted to a pointer to the rst element of array a.
Thus, in fact this is still an example of pass-by-value, with
the caveat that it is the address of the rst element of the
array being passed by value, not the contents of the array.
5
5.1
Miscellaneous
Reserved keywords
5.2
Case sensitivity
5.3
Comments
13
Expressions before a sequence point are always evaluated
before those after a sequence point. In the case of shortcircuit evaluation, the second expression may not be evaluated depending on the result of the rst expression. For
example, in the expression (a() || b()), if the rst argument evaluates to nonzero (true), the result of the entire
expression cannot be anything else than true, so b() is not
evaluated. Similarly, in the expression (a() && b()), if
the rst argument evaluates to zero (false), the result of
the entire expression cannot be anything else than false,
so b() is not evaluated.
The arguments to a function call may be evaluated in any
order, as long as they are all evaluated by the time the
function is entered. The following expression, for example, has undened behavior:
printf("%s %s\n, argv[i = 0], argv[++i]);
5.6
Undened behavior
7 References
[1] The long long modier was introduced in the C99 standard.
[2] The meaning of auto is a type specier rather than a storage class specier in C++0x
[3] Klemens, Ben (2012). 21st Century C. O'Reilly Media.
ISBN 1449327141.
[4] Balagurusamy, E. Programming in ANSI C. Tata McGraw
Hill. p. 366.
[5] see UTF-8 rst section for references
[6] Kernighan & Richie
[7] Tatham, Simon (2000), Coroutines in C, http://www.
chiark.greenend.org.uk/~{}sgtatham/coroutines.html
Missing or empty |title= (help)
General
Kernighan, Brian W.; Ritchie, Dennis M. (1988).
The C Programming Language (2nd Edition ed.).
Upper Saddle River, New Jersey: Prentice Hall
PTR. ISBN 0-13-110370-9.
American National Standard for Information Systems - Programming Language - C - ANSI X3.1591989
8 External links
Because there is no sequence point between the modications of b in "b++ + b++", it is possible to perform
the evaluation steps in more than one order, resulting in
an ambiguous statement. This can be xed by rewriting
the code to insert a sequence point in order to enforce an
unambiguous behavior, for example:
a = b++; a += b++;
See also
Blocks (C language extension)
C programming language
C variable types and declarations
Operators in C and C++
Programming in C
Storage Classes
14
9.1
Text
C syntax Source: https://en.wikipedia.org/wiki/C_syntax?oldid=669435856 Contributors: The Anome, Arvindn, Edward, TakuyaMurata, MichaelJanich, Mxn, Charles Matthews, Dcoetzee, Bevo, Jni, Robbot, RedWolf, Tobycat, Cutler, Tobias Bergemann, Kevin Sa,
Ds13, JF Bastien, Darrien, Neilc, Vadmium, Urhixidur, Joyous!, Andreas Kaufmann, Abdull, Adashiel, Corti, KneeLess, Qutezuce,
Spoon!, Cmdrjameson, Jonsafari, Mick8882003, B k, ABCD, Rotring, SteinbDJ, Kbolino, BillC, MattGiuca, Hdante, Toussaint, Btyner,
Tbird20d, TheIncredibleEdibleOompaLoompa, StuartBrady, RobertG, Akihabara, Crazycomputers, Fresheneesz, YurikBot, Pip2andahalf,
Chungyan5, Cleared as led, Nick, Mikeblas, LeoNerd, Daghall, Flipjargendy, Ms2ger, TomJF, Alex Ruddick, Dkasak, Myrdred, BiT,
Marc Kupper, Papa November, Nbarth, Abaddon314159, RedHillian, BIL, Ritchie333, Cybercobra, Matt.forestpath, Acdx, Gennaro
Prota, Derek farn, HeroTsai, CPMcE, Loadmaster, Hvn0413, EdC~enwiki, JoeBot, SkyWalker, Ahy1, AndrewHowse, Cydebot, Oerjan,
Trevyn, DmitTrix, WinBot, Widefox, Seaphoto, Billyoneal, MER-C, IanOsgood, DervishD, Tedickey, DAGwyn, ANONYMOUS COWARD0xC0DE, Gwern, R'n'B, Nono64, Pfaben, Dhrubnarayan, Flyer22, Fratrep, ClueBot, Scrumplesplunge, Iandiver, WestwoodMatt,
Frederico1234, Johnuniq, MystBot, Addbot, Btx40, Jarble, Luckas-bot, Yobot, AnomieBOT, 1exec1, RandomAct, Kristjan.Jonasson,
Sae1962, Miklcct, LittleWink, Trappist the monk, Vrenator, Der schiefe Turm, Keegscee, EmausBot, John of Reading, Ida Shaw, Sbmeirow, Ptsneves, Mobywfm, Gustedt, 28bot, ClueBot NG, ScottSteiner, Visakhmr, Widr, Helpful Pixie Bot, GKFX, AshishDandekar7,
Kurrahee, Skunk44, Jimw338, Epicgenius, Xiaokaoy and Anonymous: 137
9.2
Images
9.3
Content license