An
integer constant like 1234
is an int. A long constant is written with a terminal l (ell) or L, as in 123456789L; an integer constant too big to fit
into an int will also be taken as a long.
Unsigned constants are written with a terminal u or U, and the suffix ul or UL indicates unsigned long.
Floating-point
constants contain a decimal point (123.4) or an exponent (1e-2) or both; their type is double, unless suffixed. The suffixes f or F indicate a float constant; l or L indicate a long double.
The
value of an integer can be specified in octal or hexadecimal instead of
decimal. A leading 0 (zero)
on an integer constant means octal; a leading 0x or 0X means hexadecimal. For example,
decimal 31 can be written as 037 in octal and 0x1f or 0x1F
in hex. Octal and hexadecimal constants may also be followed by L to make them long and U to make them unsigned: 0XFUL is an unsigned long constant with value 15 decimal.
A
character
constant is an
integer, written as one character within single quotes, such as 'x'. The value of a character constant is
the numeric value of the character in the machine's character set. For example,
in the ASCII character set the character constant '0' has the value 48, which is unrelated
to the numeric value 0. If we write '0' instead of a numeric value like 48 that depends on the
character set, the program is independent of the particular value and easier to
read. Character constants participate in numeric operations just as any other
integers, although they are most often used in comparisons with other
characters.
Certain
characters can be represented in character and string constants by escape
sequences like \n
(newline); these sequences look like two characters, but represent only one. In
addition, an arbitrary byte-sized bit pattern can be specified by
'\ooo'
where
ooo is one to three octal digits
(0...7) or by
'\xhh' where hh is one or more hexadecimal digits (0...9, a...f, A...F). So we might write
#define VTAB '\013' /* ASCII vertical tab */
#define BELL '\007' /* ASCII bell character */
or,
in hexadecimal,
#define VTAB '\xb' /* ASCII vertical tab */
#define BELL '\x7' /* ASCII bell character */
The
complete set of escape sequences is
The
character constant '\0'
represents the character with value zero, the null character. '\0' is often written instead of 0 to emphasize the character nature of
some expression, but the numeric value is just 0.
A
constant expression is an expression
that involves only constants. Such expressions may be evaluated at during
compilation rather than run-time, and accordingly may be used in any place that
a constant can occur, as in
#define MAXLINE 1000
char line[MAXLINE+1]; or
#define LEAP 1 /* in leap years */
int
days[31+28+LEAP+31+30+31+30+31+31+30+31+30+31];
A
string constant, or string literal, is a sequence of zero or
more characters surrounded by double quotes, as in
"I am a string" or
"" /* the empty string */
The
quotes are not part of the string, but serve only to delimit it. The same
escape sequences used in character constants apply in strings; \" represents the double-quote
character. String constants can be concatenated at compile time:
"hello, " "world" is equivalent to
"hello, world"
This is
useful for splitting up long strings across several source lines.
Technically,
a string constant is an array of characters. The internal representation of a
string has a null character '\0' at the end, so the physical storage required is one more
than the number of characters written between the quotes. This representation
means that there is no limit to how long a string can be, but programs must
scan a string completely to determine its length. The standard library function
strlen(s) returns the length of its character
string argument s,
excluding the terminal '\0'.
Here is our version:
/* strlen:
return length of s */ int
strlen(char s[])
{
int i;
while (s[i] != '\0')
++i; return i;
}
strlen and other string functions are
declared in the standard header .
Be
careful to distinguish between a character constant and a string that contains
a single character: 'x'
is not the same as "x".
The former is an integer, used to produce the numeric value of the letter x in the machine's character set. The
latter is an array of characters that contains one character (the letter x) and a '\0'.
There is one
other kind of constant, the enumeration
constant. An enumeration is a list of constant integer values, as in
enum boolean { NO, YES };
The
first name in an enum
has value 0, the next 1, and so on, unless explicit values are specified. If
not all values are specified, unspecified values continue the progression from
the last specified value, as the second of these examples:
enum escapes { BELL = '\a', BACKSPACE =
'\b', TAB = '\t',
NEWLINE = '\n', VTAB = '\v',
RETURN = '\r' };
enum months { JAN = 1, FEB, MAR, APR, MAY,
JUN, JUL, AUG, SEP, OCT,
NOV, DEC };
/* FEB = 2, MAR = 3,
etc. */
Names in
different enumerations must be distinct. Values need not be distinct in the
same enumeration.
Enumerations
provide a convenient way to associate constant values with names, an
alternative to #define
with the advantage that the values can be generated for you. Although variables
of enum types may be declared, compilers need
not check that what you store in such a variable is a valid value for the
enumeration. Nevertheless, enumeration variables offer the chance of checking
and so are often better than #defines. In addition, a debugger may be able
to print values of enumeration variables in their symbolic form
Subscribe to:
Post Comments (Atom)
0 comments:
Post a Comment