C语言K&R圣经笔记 2.3 常量

2.3 常量

整数常量如 1234 是一个 int 。long 常量以字母 l 或 L结尾,如 123456789L;在 int 中放不下的太大的整数也会被当作是 long。无符号常量以字母 u 或 U 结尾,而 后缀 ul 或 UL表示 unsigned long。

浮点常量包含一个小数点(123.4)或一个指数部分(1e-2),或兼而有之;其类型为double,除非加了后缀。后缀字母 f 或 F 表明是 float 常量,字母 l 或 L 表示 long double。

整数值除了用十进制,还能用八进制和十六进制表示。整数常量前面加个前导的数字0,表示它是八进制数;前导的 0x 或 0X 表示十六进制。比如,十进制的 31 可以写成八进制的 037 或 十六进制的  0x1f 或0X1F。八进制和十六进制常量也能在末尾加上 L 或 U 来分别表示 long 和 unsigned,比如 0XFUL 是一个无符号长整型常量,其值为十进制的15。

字符常量是一个整数,写成由单引号包起来的单个字符,例如 'x'。字符常量的值,是机器字符集中该字符的数值。例如,在ASCII字符集中,字符常量  '0' 的值是 48,与数值 0 没有关系。如果我们在代码里写 '0',而不是写依赖特定字符集的数值48, 那么我们的程序就不依赖特定的值,而且可读性更好。字符常量用在算术运算中时,与普通的整数没有区别,不过它们大多还都是用于和其他字符比较。

在字符常量和字符串常量中,可以用转义序列来表示一些字符,比如 \n(换行);这些序列看起来像是两个字符,实际上只表示一个字符。另外,任意单字节的位模式都能用 '\ooo' 或 '\xhh' 来表示,其中 ooo 是1到3个八进制数位(0到7),而 hh 是1到2个十六进制数位(0到9 ,a到f,A到F)。因此,我们可以写:

#define VTAB '\013'    /* ASCII v-tab */
#define BELL '\007'    /* ASCII bell */

或写成十六进制:

#define VTAB '\xb'    /* ASCII v-tab */
#define BELL '\x7'    /* ASCII bell */

完整的转义序列如下:

\a        alert (bell)               \\             backslash

\b        backspace              \?           question mark

\f         form feed                \'             single quote

\n        new line                  \"             double quote

\r         carriage return        \ooo        octal number

\t         horizontal tab          \xhh        hexadecimal number

\v        vertical tab

字符常量 '\0' 代表值为0的字符,空字符。我们经常会写成 '\0' 而不是0,是为了强调某些表达式的字符属性,不过它的数值的确就是0。

常量表达式是指仅包含常量的表达式。这样的表达式可以在编译期求值而不用等到运行时,而相应地,常量表达式可以用在任何常量可以出现的地方,如:

#define MAX_LINE 1000
char line[MAX_LINE+1];

#define LEAP 1
int days[31+28+LEAP+31+30+31+30+31+31+30+31+30+31];

字符串常量,或者说字符串文本,是由双引号包起来的0个或更多字符组成的序列,如:

"I am s string"

""    /* 空字符串 */

前后的双引号不是字符串的组成部分,而是用来标出界限。前面说的用于字符常量的转义序列,同样也能用于字符串;\" 代表双引号字符。字符串常量可以在编译期间连接

"hello," " world"

等同于

"hello, world"

当源码太长,需要把长字符串拆成多行的时候很有用。

从技术上来说,字符串常量就是字符数组。字符串的内部表示会在末尾加上空字符 '\0',因此实际需要的物理存储会比双引号之间的字符数量多1。这种表示法意味着对字符串长度没有限制,但程序必须完整扫描一个字符串才能确定其长度。标准库函数 strlen(s) 返回字符串参数 s 的长度,不包括末尾的 '\0'。下面是我们自己写的版本:

/* strlen: 返回 s 的长度 */
int strlen(char[] s)
{
    int i;

    i = 0;
    while (s[i] != '\0')
        ++i;
    return i;
}

strlen 和其他的字符串函数在标准头文件 中声明。

要仔细区分字符常量和只包含一个字符的字符串:'x' 与 "x" 是不同的。前者是一个整数,用来得到机器字符集中字母 x 的数值。后者是一个字符数组,包含了一个字母(x)和一个 '\0'。

还有一种常量,枚举常量。枚举是一个整数常量的列表,如:

enum boolean { NO, YES }

枚举中的第一个名字对应的值为0,下一个值是1,由此递增,除非特别指定了值。如果没有指定所有的值,则未指定的值在最近一个指定的值之后递增,如第二个例子所示:

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 ,以此类推 */

不同枚举中的名字不能相同。同一枚举内的值不必不同。

枚举提供了一种方便的方式来关联常量名和常量值,是 #define 的替代方案,优点在于值可以自动生成。尽管可以声明enum类型的变量,但编译器不需要检查你在该变量中保存的值是否为枚举中的合法值。然而,枚举变量提供了检查的机会,因此通常比 #define 好。另外,调试器能够以它们的符号形式打印出枚举变量的值。

C语言K&R圣经笔记 2.3 常量_第1张图片

C语言K&R圣经笔记 2.3 常量_第2张图片

你可能感兴趣的:(C语言,1024程序员节,c语言,笔记)