一. 数据类型
1. C语言支持的数据类型
1) 基础类型
1.1) 数值类型
1.1.1 整型 --> 有符号(signed) --> 无符号(unsigned) 4 Bytes
短整型 (short / short int) 2 Bytes
基础整型(int) 4 Bytes
长整型(long /long int) 4 / 8 Bytes(32位操作系统占 用 4Bytes,64位操作系统中占用8Bytes)
1.1.2 浮点型
单精度浮点型 (float)
双精度浮点型 (double)
1.2) 字符类型 (char)
2) 指针类型
3) 空类型 (void)
4) 构造类型 (自定义类型)
4.1 结构体 (struct )
4.2 联合体/共用体 (union )
4.3 枚举类型 (enum )
2. C语言中数据的表现形式
2.1 常量 (程序运行过程中,取值无法改变的数据)
分类:
1) 整型常量
表现形式:
十进制: 0~9
八进制: 0开头,数码 0~7
十六进制: 0x开头,数码 0~9 A~F
进制转换方法:
其他进制 -> 十进制: 按权相加
十进制 -> 其他进制: 辗转相除法:将需要转换的数据不停的除以转换的进制数,直到 商为0,反向记录余数。
八机制 --> 十六进制: 借助于二进制,将八进制数据按位将该位上的数转换为 3位的二 进制数,转换完成后,由右向左每4位为一组,将每一组的数据转 换为1位的十六进制数据。
十六机制 -->八进制: 借助于二进制,将十六进制数据按位将该位上的数转换为 4位的二进制数,转换完成后,由右向左每3位为一组,将 每一组的数据转换为1位的八进制数据。
2) 浮点型常量
表现形式:
2.1 十进制方式的小数: 123.3 ... 0.123
2.2 指数形式: 1.233E2 1.23E-1
E(e) 之前必须是数字,之后必须是整数
针对浮点型常量,如何区分单精度还是双精度:
单精度浮点型常量可以用f做后缀, 双精度浮点型常量可以用l做后缀
3) 字符常量
字符常量: 用 ' ' 括起来的一个字符,或者一个转义字符
字符串常量: 用 " " 括起来的一个字符序列。
系统会为字符串常量自动添加 '\0' 作为结束符。
4) 符号常量
符号常量的定义格式:
#define 符号常量名 常量数据
优点:
1. 增加程序可读性(含义清楚,见名知义)
2. 增加可维护性 (一改全改)
注意:符号常量不占用内存空间,这里小编来解释一下为什么符号常量不占用内存空间?
这是因为符号常量只是一个临时符号,代表一个值,在预编译后这个符号就不存在 了,故不能对符号常量赋新值。
2.2 变量 (表面理解:程序运行过程中,取值可以改变的数据)
实质: 变量其实代表了一块内存区域。变量名可视为该内存区域的标识。
对该内存区域的访问就可以借助变量这个标识来进行。
变量的定义格式:
数据类型 变量列表;
变量的命名规范:
1. 变量名可由数字、字母、下划线组成,但是不能以数字开头,只能以字母或下划 线开头;
2. 变量名不能与系统中已有的标识符重名。
说明:
1. 变量定义时,利用同一个类型标识符可同时定义多个变量,各变量之间用 ,分隔:
例如: int a; int a,b,c,d,e;
2. 定义变量后,如果未对变量进行初值的赋予,则变量所代表的内存空间中的数据是随机 的;
3. 可以在变量定义的同时给变量赋值,这个操作称为变量的初始化,C语言允许对变量进行 初始化操作;
例如:int a = 0;
4. 初始化变量时,尽量做到类型相同 例如: long l = 567l;
5. 整型数据在内存中的存放方式:
按照补码方式存放;
正整数的补码就是将该数据转换为二进制格式;
负整数的补码就是将该数据的绝对值转换为二进制格式,按位取反,并+1;
6. 浮点型数据在内存中的存放方式
采用指数方式存放:
float : 1 8 23 偏移量
符号位 指数位 尾数部分 127
double : 1 11 52 偏移量
符号位 指数位 尾数部分 1023
例: 将 27.5 以 float 类型存放:
27.5的二进制为11011.1 指数表示法: 1.10111*2^4
指数:4,加上127(偏移量),就是131,其二进制为 1000 0011,也就是说指数位数据为 1000 0011,
尾数(小数点后的数)10111,补够23位 1011 1000 0000 0000 0000 000
所以 单精度浮点型数据27.5 在内存中存储方式如下:
0 1000 0011 1011 1000 0000 0000 0000 000
注意: 浮点型数据在内存中存放是一个近似值
7. 字符数据在内存中的存放方式
以ASCII 码存放。
8. 不同数值类型之前的混过运算:
规则: 需要转换为同一类型后运算:
类型转换: 1. 隐式类型转换 (编译系统完成)
转换规则: 低优先级类型向高优先级类型转换:
2. 强制类型转换 (程序员自己实现)
语法格式:
(目标类型) 待转换数据;
原则: 类型转换并不改变原变量的类型;
3. C语言中数据的运算 (运算符)
3.1 算术运算符(+ - * / %)
注意:1. / : 如果操作数均为整型,则结果只取整数部分。
2. % : 只能应用于整型类型
3.2 关系运算符(> < >= <= == !=)
3.3 逻辑运算符(&& || !)
3.4 赋值运算符(= += -= *= /= %=)
3.5 位运算符
& ------ 按位与 | ------ 按位或 ^ ------ 按位异或
<<------左移 >>------ 右移 ~ ------ 按位取反(0变1,1变0)
3.6 其他
运算符根据运算对象的个数不同,分为:
单目运算符 ++ --
双目运算符 + -
三目运算符 ? :
3. C语言中运算符的优先级与结合性
算术运算符 > 关系运算符 > 逻辑运算符 > 赋值运算符
其中逻辑运算符中 “非”(!)的优先级在所有运算符中最高
关注: 自增++ 自减--
前置(++i):表示在使用该运算对象之前使先它的值增1或减1,然后再使用它,即使用的 是增1或减1后的值
后置(i++):表示在使用该运算对象之后才使它的值增1或减1,即使用的是增1或减1前的值。
4. 表达式:
利用运算符连接数据形成的符合C语言规则的算式,就称为表达式;
5. 逗号运算符:
面试题: int a;
a = 3,4,6,8; 则 a = ?,若想让a的取值为8,该条语句如何写?
a=3,若要a=8,则 int a; a=(3,4,6,8);