整数(integer)常数(constant)1234是一个intlong常数是在末尾以l或者L结尾, 比如123456789L; 一个整数如果大到不能适配int, 那么会被当做long来处理。 无符号(unsigned)常数是以u或者U作为结尾, ulUL表示unsigned long

浮点(floating-point)常数包含了小数点(decimal point)(123.4) 或者 指数(exponent)(1e-2) 或者 两者兼有; 在没有后缀(suffix)指定说明的情况下, 它们的类型是属于double的。 后缀f或者F指的是float常数; 而lL则表示long double

整数的值还可以指定用八进制(octal)或十六进制(hexadecimal)来表示, 而不必一定要十进制(decimal)。 在一个整数常数中0打头表示八进制; 而如果是0x或者0X打头的话则表示十六进制。 比如, 十进制下的31可以写作用八进制来表示的037或者用十六进制下来表示的0x1f或者0X1F。 八进制和十六进制常数后面仍然可加上L来表示long以及U来表示unsigned: 0XFUL表示的是一个无符号的long*常数, 其值用十进制来表示的话是15。

字符(character)常数是整数, 其写法是'X'(所代表的字符通过单引号括起来)。 字符常数的值等于其表达的字符在机器字符表中的值。 比如, 在ASCII字符表中, 字符常数'0'的值是48。

特定的字符可以通过转义字符来表示, 如\n(newline); 这些转义字符看起来像两个字符构成, 但是实际上代表一个。 我们还可以写成这样的形式: 八进制: '\ooo', ooo是由一到三个八进制数字组成(0...7) 十六进制:'\xhh', hh是由一个或多个十六进制数字构成(0...9, a...f, A...F)。

所以我们可以有如下这样的写法: 八进制:

#define VTAB '\013' /* ASCII vertical tab */
#define BELL '\003' /* ASCII bell character */

或者, 十六进制的写法:

#define VTAB '\xb' /*ASCII vertical tab */
#define BELL '\x7' /* ASCII bell character */

完整的转义字符集: * \a alert (bell) character * \b backspace * \f formfeed * \n newline * \r carriage return * \t horizontal tab * \v vertical tab * \ backslash * \? question mark * \' single quote * \" double quote * \ooo octal number * \xhh hexadecimal number

字符串常数(string constant)实际上是一个字符数组。 事实上这个数组末尾有个'\0'。标准库里的函数strlen(s)返回的是其参数字符串s的长度(不包括'\0')

此外, 还有一种常数: 枚举常数(enumeration constant)。 枚举是一列表的常数整数值(constant integer values), 比如: enum boolean { NO, YES };
在这个enum中第一个名字其值为0, 而下一个为1, 以此类推, 除非其值另外指定了。 如果并非所有的值被指定, 那么没有被指定的值是从上一个指定的值的基础上延续下去, 如下所示:

enum escapes { BELL = '\a', BACKSPACE = '\b', TAB = '\t', 
                NEWLINE = '\n', VTAB = '\v', RETURN = '\r'}; 

enum months { JANS = 1, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV, DEC }; 
/* FEB is 2, MAR is 3, etc. */

参考: 《The C Programming Language》- Chapter 2.3