字符串和符号常量
1.字符数组
字符串是一个或多个字符的序列,C语言中的字符串都被存储在char类型的数组中。数组由连续的存储单元组成(数组即一个连续的存储空间,是同类型数据元素的有序序列),字符串中的字符被存储在相邻的存储单元中,每个单元存储一个字符。如:
先看上面的代码注释,sizeof何时可不使用圆括号取决于对象是类型还是特定量,当对象是类型时,圆括号必不可少,如:sizeof(int),当对象是特定量时,可加可不加,但为了形式上的统一以及便捷上的考虑,建议大家都加上圆括号使用;C99和C11标准专门为sizeof运算符的返回类型添加了%zd转换说明,这对于strlen()同样适用,这里提前给大家熟悉一下这两种用法,因为它们是非常重要的编程工具。
注意上面size和strLen的结果,sizeof运算符以字节为单位给出对象大小,而strlen()函数给出字符串中的字符长度,可以简单理解为:sizeof指字符串的最大长度,而strlen指字符串的实际长度,而字符串的最大有效长度为最大长度减一,至于为什么是这样,接着往下看。
下面补充数组中的字符存储情况:
T | h | i | s | i | s | a | |||
s | t | r | i | n | g | . | \0 |
每个存储单元存储一个字节,注意字符串末尾的字符\0,这是空字符,C语言用它来标记字符串的结束,空字符的ASCII码值是0,但并不意味着这是数字0,它是非打印字符;因此对于str[30]种有30个存储单元,但实际上能够存储的最大字符数量为29,剩下一个字节留给空字符。当然你不用特地在字符串后面加一个空字符,当使用scanf()读取输入时会自动完成;也不用在字符串常量末尾添加空字符,编译器会在末尾加上空字符。
2.字符串和字符的区别
字符串常量"c"和字符常量'c'不同。区别之一在于'c'是基本类型char,而"c"是派生类型,属于字符数组;区别之二'c'就是一个字符,而"c"实际上由两个字符组成:'c'和'\0'。
3.常量和C预处理器
有时候我们会在程序中写这样的代码#define PI 3.14
,大家都清楚这就是十分著名的一个常量pi,当然大家可以在计算中直接使用3.14,但是这种情况使用符号常量会更好:第一,常量名比纯数字能够表达更多的信息,使代码可读性更强;第二,如果程序中多处都要使用同一个常量来计算,使用符号常量来代替时,能够更方便的值进行修改。而为什么声明的是一个常量,不是直接使用变量呢?原因就在于变量,程序可能无意间改变变量的值,而导致程序结果出错。
前面我们讲过C预处理器#define,它包含其它文件的信息,同时预处理器也可以用来定义常量,就像上面的#define PI 3.14
,编译程序时,程序中所有的PI
都会被替换成3.14,这一过程被称为编译时替换。当运行程序时,程序中的所有替换都已完成,通常,这样定义的常量被称为明示常量(也有另外一种观点认为符号常量相当于明示常量)。C预处理器是非常有用的工具,大家要学会好好利用它。
常量的命名规范,如#define的通用格式#define NAME VALUE
,符号常量用全大写字母来表示;另外还有一种不常见的命名规范,在名称前带c_或k_前缀来表示常量,如c_pi或k_pi。当然这些约定,都是为了程序的可读性而约定俗成的,即使你不按照命名规范来声明常量,程序也能正常运行。
4.const 限定符
C90标准新增了const关键字,用于限定一个变量为只读,如const int MONTHS = 12;
表明MONTHS在程序中值为12不可更改,const用起来比#define更灵活。
5.明示常量
C头文件limits.h和float.h分别提供了与整数类型和浮点类型大小限制相关的详细信息。每个头文件都定义了一系列供使用的明示常量,如limits.h头文件包含以下类似的代码:
#define INT_MAX +32767
#define INT_MIN -32768
这些明示常量代表int类型可表示的最大值和最小值,但如果系统使用32位的int,该头文件会为这些明示常量提供不同的值。类似地,float.h头文件中也定义了一些明示常量,如TLT_DIG和DBL_DIG,分别表示float类型和double类型的有效数字位数。下面简单列举一部分limits.h中的明示常量:
CHAR_BIT | char类型的位数 | CHAR_MAX | char类型最大值 |
INT_MAX | int类型的最大值 | CHAR_MIN | char类型最小值 |
INT_MIN | int类型的最小值 | SCHAR_MAX | signed char类型的最大值 |
SCHAR_MIN | signed char类型的最小值 | UCHAR_MAX | unsigned char类型的最大值 |
这里不再过多列举,感兴趣大家可以使用文本编辑器打开并查看系统使用的这些头文件中的明示常量信息。