变量类型
C提供三种标准变量类型:
- 整数类型:int
- 浮点数类型:float
- 字符类型:char
int表示整数,占4个字节;float表示浮点数,也占4个字节;char表示单个字符(如“a”或“3”),占1个字节;字符串被声明为字符数组。
C还提供如下派生类型:
- double(8字节浮点数类型)
- short(2字节整数类型)
- unsigned short或unsigned int(非负整数,没有符号位)
运算符及其优先级
C中的运算符和大多数语言类似:
+ 加
- 减
/ 除
* 乘
% 取模
/ 运算符在操作数都是整数的情况下执行整数除法运算,否则执行浮点数除法运算。例如:
void main()
{float a;a=10/3;printf("%f\n",a);}
上面这段代码将会打印出一个浮点数,因为a被声明为float。但由于执行的是整数除法运算,所以a的值是3.0。
C的运算符优先级和大多数语言的也很类似,即先乘除,后加减。5+3*4 的结果是17,不是32,因为*比+有更高的优先级。使用括号可以改变正常的优先级顺序:(5+3)*4的结果是32。因为在括号中5+3优先计算。我们后面还将遇到运算符优先级——引入指针后C的运算符优先级会变得复杂一些。
类型转换
C可以自动类型转换。特别是使用指针时需要经常这样做。某些类型间的赋值操作时也会发生类型转换。例如,上面的程序中整型数值被自动转换为浮点型。
显式类型转换时,将目的类型放在括号中,并放在要转换的数据之前。例如,在上面的程序中,将a=10/3;替换为a=(float)10/3;后会得到结果3.33333,因为10在做除法之前已被转换为浮点数了。
Typedef
使用C的typedef语句,用户可以声明自定义的类型。例如,下面代码定义了一个C程序中经常用到的类型:
#define TRUE 1
#define FALSE 0
typedef int boolean;
void main()
{boolean b;b=FALSE;……}
这段代码在C程序中声明布尔型的变量。
如果您不喜欢把实数的类型称为“float”,您可以这样写:
typedef float real;
然后就可以使用实数类型了:
real r1,r2,r3;
只要在使用之前定义,typedef 语句可以出现在C程序的任何地方。
结构体
在 C 语言中可以使用结构体把变量组织到一起。例如:
struct rec
{int a,b,c;float d,e,f;};
struct rec r;
如上例所示,每当要声明rec型的结构体时,都要写struct rec。这条规定很容易被忘记。一旦您由于疏忽忘了写上struct,就会遇到很多编译错误。上面的代码可以缩减为下面的形式:
struct rec
{int a,b,c;float d,e,f;} r;
即用一个语句同时声明了rec类型和一个rec类型的变量r。您也可以使用typedef 语句定义结构体类型的名字。例如,如果您不喜欢每次声明一个结构体变量时都去写struct rec r,则您可以用:
typedef struct rec rec_type;
定义一个新类型,然后就可以声明rec_type类型的变量了:
rec_type r;
使用句点(.)访问结构体的成员。如r.a=5;。
数组
在一般变量声明的变量名后加上数组的大小即可声明一个数组,如下所示:
int a[10]; /* 整数数组 */
char s[100]; /* 字符数组(C 的字符串) */
float f[20]; /* 实数数组 */
struct rec r[50]; /* 结构体数组 */
增量
长记法 短记法
i=i+1; i++;
i=i-1; i--;
i=i+3; i += 3;
i=i*j; i *= j;
动手一试
试写几段代码研究一下类型转换和运算符优先级。考查对象包括int、char、float等。
创建一个结构体数组,然后编写一段代码,使其基于结构体的一个整型成员对结构体数组排序。
C 常见错误
如前所述,当使用/运算符计算两个整数时常常会得出意想不到的结果。用前请三思。