数据类型
在程序中所有变量都需要先定义后使用。对变量的定义包括:数据类型,存储类型,作用域
数据类型分为:基本类型、构造类型、指针类型、空类型。
基本类型
基本类型的最主要特点是,其值不可以在分解成其他类型。
构造类型
构造类型的值可以进行分解,分解成一个或多个基本类型或构造类型。
C语言中常见的构造类型有:结构体、共用(联合)体、数组
指针类型
指针的值表示某个变量在内存储器中的地址,取值类似于整形,但是完全不同,不能混为一谈
空类型
“void”,主要出现在函数声明,声明其函数调用后不需要向调用者传递参数
常量与变量
在程序中,其值不可以改变的称为“常量”,可以改变的称为“变量”
可以与其数据类型结合:整型变量/常量、浮点变量/常量、字符常量/变量、枚举常量/变量
在程序中,常量可以不经过声明定义直接引用,但是变量必须遵守先定义后使用的原则
常量和符号常量
在程序执行过程中,其值不发生改变的量称为常量
- 直接常量
- 整形常量 2,5,4
- 实型常量 2.1,5.2,3.1
- 字符常量 ‘a’,‘b’
- 标识符:用来标识变量名、函数名、数组名、类型名、文件名的字符
- 符号常量:符号常量在使用之前必须先定义(#define 标识符 常量),用一个标识符表示一个常量。符号常量特点:含义清楚,一改全变
一般符号常量用大写,变量标识符用小写,注意C语言的书写规范
变量
变量需要先定义在使用,一般定义在函数体的开头
变量应该有一个名字(变量名)、在内存中为这个变量开辟一定的存储单元,变量值存放在存储单元中
整形数据
常量的表示方法(个人认为挺重要,容易踩坑)
使用的整常数有八进制、十六进制、十进制、二进制(这里二进制,谭浩强的书中没有涉及,但是是可有的)
十进制整数:
十进制整数没有前缀,范围是0-9
在程序中是依靠前缀来区分各种进制数的,因此在书写常量的时候不要把前缀弄错造成结果不正确。
八进制整数
八进制整数必须以0开头,范围是0-7,不会出现负号如(-0752)
八进制要注意范围,最大是7,出现8就是错误了
十六进制
十六进制必须以0x(0X)开头,范围是0-F,其实0x代表数值中的A-F是小写表示,0X则代表大写表示
二进制
二进制必须以0b(0B)开头,只有0和1
二进制并不是所有编译器都可以的,Visual Studio2010及以下的不支持,GCC 3.4.5及以下的不支持
整数常数的后缀
在16位机器上,基本整形占2字节,长度是16位(32位机器上,整形是4字节),因此十进制的无符号整形的范围是0-65537,有符号的十进制整形的范围是-32768~+32767;八进制、十六进制自己推吧。如果表示的数超出了范围,就必须用常整形(long)来表示,长整形数就是后缀用L/l表示
PS:长整型数15L和整型数15,在数值上没有区别,但是15L因为是长整形变量,C也会为它分配4个字节的存储空间;而15只会分配2个字节。
无符号的整型数后缀用U/u表示 0xA1LU 表示一个无符号长整型的十六进制A1。
整型变量
整形数据在内存中的存放方式
整形变量的数值是以补码的形式存放的。
- 正数的补码和原码相同
- 负数的补码是将该数的绝对值的二进制形式按位取反再加1
整形变量的分类
- 基本型 int 在16位机器中占2字节,32位机器中占4字节
- 短整型 short int或short 占2字节
- 长整型 long int或long 占四字节
- 无符号类型 unsigned
- unsigned int 或unsigned
- unsigned long
- unsigned short
无符号类型和有符号类型占用的字节是一样的,但是省去了一位符号位,所以不能表示符数,且表示的整数范围大于有符号类型。
整型变量的定义
一般形式为:
类型说明符 变量名标识符,变量名标识符….;
- 允许在一个类型说明符后连续定义多个相同类型的变量。各类型之间使用逗号间隔。类型说明符与变量标识符之间至少有一个空格间隔。
- 以“;”结尾
- 变量定义必须在使用前,一般在函数体的开头。
整型数据的溢出
16位机器中,如果在32767的基础上加1则溢出了,则是-32768.
我这里使用32位机器做示例,在32位中int的最大值是2147483647。
实型数据
实型常量的表示方法
C语言中,实型只采用十进制;他又两种表现形式:十进制小数形式、指数形式
- 十进制小数形式:由0~9和小数点组成(必须有小数点)
- 指数形式:指数形式由十进制数加“e”/“E”组成以及阶码(阶码只能为整数,可有带符号)
指数形式的一般形式:aEn(a为十进制,n为十进制整数),其值为a*10的n次方
考点:带小数点,阶码标识的前后都要有数字,阶码符号应该放在阶码标志后面
标准C中允许浮点数使用后缀,后缀为“f”/“F”,162.0F和163.0是一样的
(这里谭浩强书写的162f与162.0一样,但是现在的编译器并不认162f)
实型变量
实型数据的存放形式
实型数据一般以指数的形式存放,实型数据float占据4字节、double占八字节,下为3.14159的存放形式
可以看出
- 当小数点部分占据的范围越多,可以表示的精度越高;
- 指数部分占据的越多,表示的范围越大
实型变量的分类
实型变量分为:单精度(4字节)、双精度(8字节)、长双精度(16字节)
实型数据的舍入误差
由于实型变量是有限的存储单元组成,C语言中,小数点后最多保留6位,其余部分四舍五入
实型常量的类型
实型常量都按double双精度型处理
字符型数据
字符常量
字符常量是用单引号括起来的一个字符’a‘
注意:
- 字符常量只能用单引号,不能用双引号或者其他括号
- 字符常量只能是单个字符,不能是字符串
- 字符可以是字符集中的任意字符,但是5和’5‘并不是一个概念
转义字符
转义字符是特殊的字符常量,其以’\’反斜杠开头,转义字符具有特定的含义
表中的\ddd、\xhh分别为八进制和16进制,其可以表示所有的ASCII码,所以任何一个字符都可以由转义字符表示。
字符变量
字符变量用来存储单个字符,类型说明符是char
字符数据在内存中的存储形式及使用方法
每个字符变量被分配一个字符的内存空间,因此只能存放一个字符
字符以ASCII码的形式存放在内存单元中
C语言中允许对整型变量赋以字符值,也允许字符变量赋以整型值,输出中也允许字符型按整型输出,整型按字符型输出
字符串常量
字符串常量是由一对双引号括起的字符序列
字符常量和字符串常量是不同值,他们之间主要有以下区别
- 字符常量是单引号,字符串常量是双引号
- 字符常量只能包括一个字符,字符串常量可以包含一个或多个字符
- 字符常量占据1个字节,字符串占据的字节是等于字符串中的字符数+1,字符串以’\0‘结尾
变量赋初值
变量定义中赋值的一般形式是
类型说明符 变量1=值1, 变量2=值2,….;
定义中不允许连续赋值,如 a=b=c=5是不合法的
各类数值型数据之间的混合运算
1变量的数据类型是可以转换的,转换包括:·自动转换、强制转换
自动转换
自动转换发生在不同数据类型的量混合运算中,由编译系统自动完成。自动转换遵循以下规则:
- 先转换同一类型,再进行计算
- 转换按照字符长度增加的方向进行,确保精确值不降低
- 所有的浮点数运算,都是先转换为double进行的,即使仅有float的表达式
- char和short参与运算时,必须先转换为int
- 在赋值运算时,若赋值运算符左右两边的数据类型不同,在将赋值号右边的数据类型转换为左边的数据类型;如果右边量的数据长度大于左边量,将丢失一部分数据,丢失数据进行四舍五入向前舍入
算数运算符和算术表达式
C语言中的运算符可以分为以下几类:
- 算术运算符:+、-、*、/、%、++、–
- 关系运算符:>、<、==、>=、<=、!=
- 逻辑运算符:&&、||、!
- 位操作运算符:>>、<<、&、|、~、^、>>、<<
- 赋值运算符:简单赋值=、复合算术赋值+=、-=、*=、/=、%=、复合位运算赋值&=,|=,^=,<<=,>>=
- 条件运算:?:
- 逗号运算:,
- 指针运算:*、&
- 求字节运算符:sizeof
- ()、[]、->、.
算术运算符与算数表达式
除法运算符:’/’当参与运算均为整型时,结果也为整型,舍去小数。当运算中有一个是实型,结果就是双精度浮点型
求取余数:’%‘要求参与运算的量均为整型。
- 算数运算符使用算数运算符和括号将运算对象连接起来的、符合C语法规则的式子
- 运算符的优先级一共分为15级,1级最高;优先级较高的先有优先级较低的进行运算。当优先级相同时则按结合方向处理
- 运算符的结合性:分为左结合、右结合。算术运算符的结合性是左结合,自左向右计算;赋值运算是右结合,自右向左进行赋值运算
- 强制类型转换运算符:一般形式为(强制转换的类型说明符)表达式
- 自增自减运算符:其功能是在变量的基础上自增/自减1
- ++i先自加再赋值; i++先赋值再加加;–同理。复杂表达式中不要搞混
赋值运算符和赋值表达式
- 赋值运算符
简单赋值运算符为=表示;一般形式为变量=表达式,将表达式的值赋值给变量。a=b=c=5,可以理解为(a=(b=(c=5)))
- 类型转换
赋值运算两边的数据类型出现不同时,系统会自动进行类型转换;因为赋值运算是右结合,所以就是将右边的类型转换成左边的类型:
- 实型赋予整型时:舍去小数部分
- 整型赋予实型时:数值不变,但以浮点型形式存放
- 字符型赋值整型:字符为1字节,整型为2/4字节,故ASCII码值放到整型地址的第八位,其余高位为0
- 整型赋予字符型:只需把第八位赋予字符量
- 复合的赋值运算符:在赋值符“=”之前加上一个其他二目运算符;复合赋值运算的写法,虽然初学可能不太习惯,但是十分利于编译处理,提高编译效率
逗号运算符和逗号表达式
C语言中,’,‘也是一种运算符,其功能时把多个表达式连接起来组成一个表达式
表达式1,表达式2,表达式3,……
其求值的过程是分别计算表达式的值,并以最后一个表达式的值作为逗号表达式的值
PS:但并不是所有的逗号,都是逗号表达式,函数参数、多个变量定义中都会出现逗号,只是用来做各变量之间的间隔符