数据类型一般是按照被定义变量的性质、表现形式、占据的内存大小、构造特点来进行划分的。
C语言中,数据类型分为:基本数据类型、构造数据类型、指针类型、空类型四大类。
基本类型又分为:整型、字符型、实型(或浮点型)、枚举类型。
实型(或浮点型)分为:单精度型、双精度型。
构造类型又分为:数组类型、结构体类型、共用体类型。
①基本数据类型:其值不可以再分解为其它类型。
②构造数据类型:一个构造类型的值可以分解成若干个成员或者元素。每个成员都是一个基本数据类型或者又是一个构造类型。
③指针类型:其值用来表示某个变量在内存存储器中的地址。
④空类型:在调用函数值时,通常应向调用者返回一个函数值,也有一类函数,调用后不需要向调用者返回函数值,这种函数可以定义为“空类型”,其类型说明符为void。
对于基本数据类型,按其取值是否可以改变又分为常量和变量两种。他们可以和数据类型结合起来再分类:整型常量、整型变量、浮点常量、浮点变量、字符常量、字符变量、枚举常量、枚举变量等。
在程序中,常量是可以不声明直接引用的,而变量需要先声明。
直接常量:整型常量5、-9、6,实型常量2.1、 3.14,字符常量‘a’ 、‘d’
标识符:用来标识变量名,符号常量名、函数名、数组名、类型名、文件名的有效字符序列。
符号常量:用标识符代表一个常量。
符号常量在使用之前需要先进行定义,形式为
#define 标识符 常量
上面的#define是预处理命令,其功能为在后续程序中,出现的所有标识符都由该常量值代替。
从习惯上,符号常量的标识符都用大写字母来表示,而标量的标识符则用小写字母。
符号常量与变量不同,其值在其作用域内不能改变,也不能再被赋值。
使用符号常量的好处是,含义清楚,能做到改一个,改全部。
变量定义必须放在变量的使用之前,一般放在函数的开头部分。
在C中,使用的整型常数有,8 、 10 、 16进制3种。
十进制:225,265,-55
八进制:八进制整数常数必须以0开头,作为其前缀,八进制数通常为无符号数。015,0111,0177
十六进制:其前缀为0X或0x,0X2A,0XABC
后缀:长整型常数,无符号数等。0XA5L,358u,0x32Lu,0x37Au
任何数据的存放都是二进制的格式,并且数值是以补码的形式表示的。
正数的补码与原码相同,负数的补码,将该数的绝对值的二进制形式按位取反再加1。
不同操作系统,int、long等数据类型的字节数有差异。
基本型:说明符int,一般占用2字节
短整型:说明符short int 或short,字节数与int相同
长整型:说明符long int 或long,占4个字节
无符号型:基本型unsigned int或 unsigned,短整型说明符unsigned short,长整型unsigned long
定义变量的一般形式:
类型说明符 变量名标识符,变量名标识符,......;
unsigned a,b;
与编译器环境有关
实型也称之为浮点型。实型常量也称为实数或者浮点数。在C中,实数只采用十进制,他有2种形式,即十进制小时和十进制指数。
例如:0.32,3.14159,-2.225
指数形式:由十进制数,加阶码标志e或者E以及阶码组成(阶码只能为整数,可以带符号)
其形式为:a E n = a*10的n次方
例如:3.1E6 = 3.1*10^6 -2.4e-3 = -2.4*10^-3
在C中允许浮点数使用后缀f或者F,225f与225.等价。
实型数据一般占用4个字节(32位)的内存空间,按指数形式存储。实数3.14159的存放形式为:
+ 0.31416 1
数符 小数部分 指数
小数部分占得位(bit)数愈多,数的有效数字越多,精度越高
指数部分占得位数越多,则能够表示的数值范围越大。
实型变量分为:单精度(float型)、双精度(double型)和长双精度(long double型)3类。
单精度型占4个字节(32位),其数值范围位3.4E-38~3.4E+38,只能提供7位有效数字。双精度占8个字节(64位),其取值范围为1.7E-308~1.7E+308,可以提供16位有效数字。
实型变量能够提供的有效数字总是有限的,故一个数字在存储时总是会有舍入现象。
例1:
main()
{
float a,b;
a = 123456.789e5;
b = a+20;
printf("%f , %f\n",a,b);
}
输出的结果为:
12345678848.000000
12345678848.000000
例2:
main()
{
float a;
double b;
a = 33333.33333;
b = 33333.33333333333333;
printf("%f\n%f\n",a,b);
}
输出结果为:
33333.332031
33333.333333
由于a是单精度浮点型,有效数字为7位,整数占5位,故小数2位后面均为无效数字。
b是双精度,有效位为16位,但是C规定小数后最多保留6位,其余部分四舍五入。
实型常数不分单双精度,都按照双精度double类型处理
字符型数据包括字符常量和字符变量。
例:
‘f’,
字符常量只能用单引号括起来,不能用双引号或其他括号
字符常量只能是单个字符,而不能是字符串
字符可以是字符集中的任意字符,但是数字被定义为字符型之后就不能再参与数值的计算。比如3和‘3’是不同的,因为‘3’是字符常量,不能参与运算。
转义字符是一种特殊的字符常量。转义字符以反斜线“\”开头,后面跟一个或几个字符,转义字符含有特定的含义,不同于原有的字符含义。例“\n”是一个转义字符,其意义为回车换行。
字符变量用来存储字符常量,即单个字符
类型说明符为 char
例: char x,y;
每个字符变量会被分配一个字节的存储空间,只存放一个字符。字符的值是以ASCII码的形式存在变量的内存单元中。
如x的十进制ASCII码为120,对字符变量a赋值
a = 'x';
实际上是在a的单元内存放的120的二进制码。
即01111000
所以可以把字符量看成是整型量,C语言允许对整型变量赋以字符值,也可以对字符变量赋以整型值。并且在输出时,允许把字符变量按照整型变量输出,反之亦可。
但有点区别需要注意,整型量为2字节,而字符量为单字节,当整型量按字符量处理时,只有低8位参与计算。
字符串常量是由一对双引号括起来的字符序列。例如“Beijing”、“RMB255”
字符串常量与字符的区别:
1.字符常量单引号括起来,而字符串常量由双引号括起来
2.字符串常量只能是单个字符,字符串常量则由一个或多个字符
3.可以把一个字符常量赋值给字符变量,但不能把一个字符串常量赋值给一个字符变量
4.字符常量占用一个字节的内存空间,而字符串常量占用的内存字节数等于字符串中字节数+1,增加的一个字节用来存放字符“\0”,这是字符串结束的标志。
例:
字符常量'x' 字符串常量"x"
在内存中的情况 x x \0
赋初值的一般形式:
类型说明符 变量1 = 值1,变量2 = 值2,......;
在定义中不允许连续赋值,如 x=y=z=7;
变量的数据类型是可以转换的,转换分为自动转换和强制转换。
自动转换由编译系统自动完成,强制转换是通过类型转换运算来实现的。
自动转换:
1.若参与运算量的数据类型不同,先转换成同一类型,然后再进行计算
2.转换按照数据长度增加的方向进行,以保证精度不丢失,如int和long进行计算时,先把int转为long再计算
3.所有的浮点运算都是以双精度进行,仅含有float的单精度运算的表达式也需要先转换成双精度再运算。
4.char和short类型在进行运算前,都需要先转换int型
5.在赋值运算中,当等号两边的数据类型不同时,赋值右边的类型将自动转换为等号左右的数据类型。当右边的数据类型长度大于左边时,将会丢失一部分数据,丢失的部分按照四舍五入向前舍入。
强制转换:
其一般形式:
(类型说明符)(表达式)
例:
(float)x (int)(a-b)
1.类型说明符和表达式都必须加括号(单个变量可不加)
2.不论是强制还是自动转换,都是在本次运算时进行的临时性转换,不改变声明时对该变量的数据类型。
1.算术运算符用于各类数值的运算
+ - * / %(求余或称模运算)++ -- 共7种
2.关系运算符用于比较运算
> < == >= <= != 共6种
3.逻辑运算符用于逻辑运算
&& || ! 3种
4.位操作运算符,参与运算的量,按二进制位进行运算
& | ~ ^(位异或) <<(左移) >>(右移) 6种
5.赋值运算符用于赋值运算
简单赋值 = 复合算数赋值+=,~=,*=,/=,%=
复合位运算赋值 &= ,|=,>>=,<<= 11种
6.条件运算符
三目运算符用于条件求值 a?b:c
7.逗号运算符
用于把若干表达式组合成一个表达式(, )
8.指针运算符
用于取内容(*)和取地址(&)2种运算
9.求字节数运算符
用于计算数据类型所占的字节数(sizeof)
10.特殊运算符
括号(),下标,成员(→, .)等
"+" 双目 右结合性
"-" 双目,作为负值运算符时,单目,左结合性
"*" 双目 左结合性
"/" 双目 左结合性 运算量均为整型时,结果也为整型,舍去小数。如果运算中有一个是实型,则结果为双精度实型。
例10/3 结果为3
"%" 双目运算符,左结合性,要求参与的量均为整型
表达式是由常量、变量、函数和运算符组合的式子。表达式求值按照运算符的优先级和结合性的顺序进行。单个的常量、变量、函数可以看作是表达式的特例。
算术表达式:是由算术运算符和括号连接起来的式子。
1.算术表达式:
x+y (c*2)/2 ++p sin(s)+cos(u)
2.运算符的优先级
C语言中,运算符的优先级分为15级,优先级高的要先于优先级低的进行运算,若一个运算两侧的优先级相同时,则按结合性的方向处理。
3.运算符的结合性
分为2种,左结合和右结合
左结合:
例a+b-c, 先执行a+b 得到的值再和c运算
右结合:
a=b=c 先执行b=c,得到的值再与a运算
(3)自增,自减运算符
++i i自增1后再参与其他运算
--i i自减1后再参与其他运算
i++ i参与运算后,i的值再自增1
i-- i参与运算后,i的值再自减1
其一般形式为:
变量=表达式
a = b = c = 0 等价于 a=(b=(c=0))
表达式
x=(a=5)+(b=2)
x应为7
1.实型赋予整型,舍去小数部分
2.整型赋予实型,数值不变,将以浮点形式存放,即增加小数部分(0)
3.字符型赋予整型,由于字符型为单字节,整型为2字节,故将字符的ASCII码值放到整型的低八位中,高八位为0。
构成复合赋值表达式的一般形式为:
变量 双目运算符 = 表达式
等价于
变量 = 变量 运算符 表达式
例:
x-=3
a*=b+2
b%=o
逗号表达式其功能为把两个表达式连接起来组成一个表达式,一般形式为
表达式1,表达式2 (可以嵌套)
其求值过程是分别求两个表达式的值,最后以表达式2的值作为整个逗号表达式的值。