1、三字母词、转义字符
三字母词:三个字母的序列合起来表示一个字符。两个问号开头再尾随一个字符 。
eg:
??( [ /*?? 开头*/
??) ]
??! |
作用:如果你所使用的字符集缺少某些字符,可以使用三字母词表示缺少的字符。
转义字符:由一个反斜杠加上一个或多个其他字符组成。
\? 在连续书写多个问号时使用,防止他们被解释为三字母词。
\"用于表示字符串内部的双引号。 “abc\"defgh”
\' 用于表示字符常量
\\ 用于表示一个反斜杠,防止它被解释为一个转义序列符 。
其他转义字符还有:\a \n \b \t \f \v 等等。
\ddd ddd表示1--3个八进制数字,这个转义字符表示的的字符就是给的的八进制数值所代表的字符、
\xddd 与上面类似,只不过这个ddd是十六进制数 。
2、如果注释符/**/ 出现在字符串字面值内部,就不再起注释界定符的作用了。
所有的注释都会被预处理器拿掉,取而代之的是一个空格,因此。注释可以出现在任何空格可以出现的地方。
3、整型值之间的大小规则
标准并没有规定长整型必须比短整型长,只是规定它不得比短整型短、。
总结起来就一句话:
长整型至少应该和整型一样长,而整型至少应该和短整型一样长、
short int 至少16位,ling int 至少32位,至于缺省的int 究竟是16位还是32位,或者是其他值则由编译器设计者决定。
4、char类型
char类型本质上就是小整型。容纳一个字符、
缺省的char要么是signed char,要么是unsigned char,这取决于编译器,这个事实意味着不同的机器上的char可能拥有不同范围的值,所有当程序所使用的char型变量的值位于signed char 和 unsigned char 的交集中,这个程序才是可移植的。
5、枚举类型
枚举类型就是指它的值为符号常量,而不是字面值的类型。
枚举类型声明:
enum Jar_Type{CPU , PINT , QUART , HALT , GALLON };
枚举变量的声明:
enum Jar_Type a,b,c; /*声明 3个枚举变量 a b c */
注意2点:
1、枚举类型里声明的枚举枚举常量之间用逗号分隔,并且枚举类型定义的变量只能用枚举常量给它赋值,不能用整数或其他形式辅助!
a = CPU; /*正确*/
a = 0; /*错误,不属于同一类型*/
a = (Jar_Type) 0 ; /*正确,强制类型转换*/
2、这种类型的变量实际上是以整型的方式存储的,这些符号名的实际值都是整型值,如果没有给枚举常量指定值,枚举常量的值默认是从 0 开始的(CPU=0)。以此类推,适当的时候你可以为这些变量指定特定的值,如:
enum Jar_Type{CPU , PINT=10 , QUART , HALT=15 , GALLON };
像上面这样,只对部分符号指定值也是合法的,如果某个符号未显示指定一个值,那么它的值就比前面一个符号名的值大 1 。
总结、作用:
如果一个变量(整型)只能有几种可能的取值,可以定义为枚举类型,所谓枚举类型就是将变量的值一一列出来,变量的值只能在列出来的值的范围内。
6、C数组值得关注的一个地方是,编译器并不检查程序对数组下标的引用是否合在合法的范围之内,即,不对数组下标的有效性进行检查。所以在使用时要注意数组越界的问题。
7、声明指针变量时,要注意星号(*)所带来的问题。
int* a,b,c;
人们可能很自然的认为这三个变量被声明为 int*的指向整型的指针,但事实上并非如此。星号*实际上是表达式*a的一部分,a是一个指针, b和c都是普通整型变量,要声明3个指针的正确形式是:
int *a , *b , *c;
在使用指针时,星号最好和变量靠近一些,防止这样的失误。
8、函数如果省略了返回值类型和参数类型,编译器就会默认为int型。
函数的形参不能声明为static类型,因为static类型变量是存储在静态存储区的,而函数的实参都是在堆栈中传递给函数的。形参多用const修饰为只读,起保护作用。
9、typedef 与 #define
在定义一种新的数据类型时应该使用typedef,而不是使用#define,因为后者无法正确处理指针类型、
#define P_CHAR char*
P_CHAR a , b;
/*
* 本意上是定义2个字符类型的指针,实际上只有a是指针变量,b确实一个普通的字符变量。以为宏在展开式只是简单的替换操作。
*/
正确定义如下:
typedef P_CHAR char*
P_CHAR a , b; /*a ,b都为指针变量*/