一、数据类型
注:
变量:该内存里的内容可被修改(eg:int data)
常量:该内存里的内容初始化后就不能被修改。(eg:100、10.123)
1.1 基本数据类型
char ---- 1字节、short ---- 2字节、int ---- 4字节、
long ---- 4字节(32位系统)/ 8字节(64位系统)、
float ---- 4字节,double ---- 8字节
unsigned (char、short、int、long) ---- 无符号整型
long double ---- 16字节
1.2 计算机为什么要设计这么多的数据类型?
答:合理分配内存,提高内存使用率。
1.3 整型
1.3.1 整型变量
整数类型数据即整型数据,无小数部分的数值。
整型数据类型可分为:char、short、int、long、int8、int16、int32、int64、(无符号整形数:unint8、uint16、uint32、uint64)
注:标识符-命名规则(由字母、下划线、数字组成,必须是以字母和下划线开头,并且不是关键字)
1.3.2 整型常量
整型数据 ---- 正整数:1,2,3,4;负整数:-1,-2,-3
整型常量 ---- 八进制:0101;十六进制:0x101
1.4 浮点型
1.4.1 浮点型变量
float data = 1.1; //单精度浮点型4字节
double data = 1.1; //双精度浮点型8字节
1.4.2 浮点型常量
1.0、2.0
科学计数表示法:3141592 ---- 3.1415926e6
1.5 字符型
注:
字符型就是char。字符型是一种数据类型,占用1字节空间;字符是一种符号,用ASCII码表示。
1.5.1 字符变量
char data = ‘a’; // 输出97
char num = 123;
1.5.2 字符常量
字符常量’a’;
字符串常量“a” ---- {‘a’, ‘\0’}
1.6 取值范围计算
数据在计算机中以二进制存储(进制转换)
1.6.1 十进制转二进制、二进制转十进制
浮点数十进制转二进制,分两部分,整数部分除以2取余数,倒序得到正数部分二进制数,小数部分乘以2取整数,顺序得到小数部分二进制数。
浮点数二进制转十进制,小数点前从2的0次方开始乘,小数点后从2的-1次方开始乘,最后加起来即为十进制数。
1.6.2 二进制转十六进制,十六进制转二进制(8421码),一个十六进制位转4个二进制位
十六进制:0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F
1.6.3 二进制转八进制,八进制转十六进制(421码),一个八进制位转3个二进制位
1.6.4 unsigned char 取值范围
假如是char类型变量,占1个字节8个位。
最大取值为8个1,255(2^8 - 1)
最小取值为8个0,0
unsigned short 取值范围:0 ~ 2^16 - 1
unsigned int 取值范围:0 ~ 2^32 - 1
1.6.5 char(有符号)
char 类型1字节8位,规定最高位是符号位(0正,1负)
正整数在内存中是用原码存储:数据位的二进制码
负整数在内存中是用补码存储:原码----数据位的二进制码;反码----数据二进制位取反;补码----反码 + 1
char 取值范围:-128 ~ 127
1.6.6 浮点数据取值范围
1.6.6.1 单精度浮点型32位(符号s,阶码e—范围,尾码m—精度)
符号位占用1位(s):0表示正数,1表示负数
阶码位(指数位)占用8位(e):实际的指数为 e - 127 ,解决指数为负数的可能。
尾数位占用23位(m):二进制小数形式表示法(具体格式为1.m)
举例:
1234.125 —> 二进制(100 1101 0010.001)—> 整数部分保留一位有效数1.00 1101 0010001 * 2^10
尾码不够位数后面补0
单精度浮点型取值范围:-1.0 * 2^128 ~ 1.0 * 2^128
1.6.6.2 双精度浮点型64位(符号s,阶码e—范围,尾码m—精度)
符号位占用1位(s):0表示正数,1表示负数
阶码位(指数位)占用 11 位(e):实际的指数为 e - 127 ,解决指数为负数的可能。
尾数位占用 52 位(m):二进制小数形式表示法(具体格式为1.m)
二、 运算符
2.1 算术运算符
2.1.1 最常见算术运算符:+、-、*、/、%
除号/:
(1)整除:5 / 2 = 2
(2)浮点数除:5 / 2.0 = 2.5
取余/求模%:
操作数必须为整数(eg:10 % 3 —> 1)
2.1.2 数据类型转换
在不同类型的数据进行运算时,先自动转换为同一类型(小空间向大空间转换)
char --> short --> int --> long;int --> float【自动转换】
long --> int --> short --> char;float --> int【强制转换】
2.2 关系运算符
大于>,小于<,等于==,大于等于>=,小于等于<=,不等于!=
在算术中 (0 < a < 10),在C语言中要转换为 (a > 0 && a < 10)
2.3 逻辑运算符
逻辑与&&,逻辑或||,逻辑非!
逻辑与&&:遇假则假(遇 0 为 0)
逻辑或||:遇真则真(遇 1 为 1)
2.4 位运算符
位与&,位或|,位非!,位移(左移<<,右移>>),异或^
3 & 4 ----> 0011 & 0100 = 0000(清零用与)
3 | 4 ----> 0011 | 0100 = 0111(置一用或)
~3 ----> ~0011 = 1100
3 << 1 为 6;3 << 2 为 12;3 << 3 为 24【规律:一个数左移n位,结果为这个数乘以2的n次方】
24 >> 1 为 12;24 >> 2 为 6; 24 >> 3 为 3【规律:一个数右移n位,结果为这个数除以2的n次方】
异或^:相同为0,不同为1【规律:一个数A被另一个数B异或两次,结果为A本身】eg :3 ^ 4 ^ 4 ,结果为3.
2.5 特殊运算符
2.5.1 复合运算符 +=、|=、 &=
a += 3 —> a = a + 3;
a += 3 - 10 —> a = a + (3 - 10);
a |= 1 << 10 —> a = a | (1 << 10);
2.5.2 条件运算符(三目运算符)条件表达式?表达式A:表达式B
int a = 10,b = 20;
int max = a > b ? a : b;
2.5.3 自加++、自减–
2.5.3.1 符号在前,++A
符号在前,先加后用,加和用都是A本身。
2.5.3.2 符号在后,A++
符号在后,先用后减,使用的是A的副本。
2.5.4 逗号运算符
int a = 0;
a = (1 + a, 2, 3, 4); //只取最后一位
printf("%d\n", a);
2.5.5 运算符优先级表
三、控制流语句
3.1 分支语句 if - else ; switch - case
3.1.1 if - else语句
格式:
//第一种情况只有if,没有else
if(条件表达式){
//当条件表达式为真才会执行这里
}
//第二种情况有if和else
if(条件表达式){
//当条件表达式为真会执行这里
}else{
//当条件表达式为假会执行这里
}
//第三种情况有if-else嵌套
if(条件表达式1){
//当条件表达式1为真会执行这里
}else if(条件表达式2){
//当条件表达式2为真会执行这里
}else if(条件表达式3){
//当条件表达式3为真会执行这里
}else{
}
3.1.2 switch - case 语句(开关语句)
格式:
switch(整型数)
{
case 常量:语句;break;
case 常量:语句;break;
case 常量:语句;break;
case 常量:语句;break;
default:语句;
}
3.2 循环语句 for,while,do - while
3.2.1 for 循环
格式:
for(表达式1;条件表达式;表达式2)
{
循环体
}
3.2.2 while 循环语句
格式:
while(条件表达式)
{
//表达式为真就进入循环体,为假就退出循环体
}
3.2.3 do - while 循环语句
格式:先执行循环体语句,再判断表达式是否为真
do{
循环体语句
}while(条件表达式);
3.3 跳转语句 break,continue,goto,return
3.3.1 break语句
break语句应用在 switch 语句中跳出 switch 语句,for、while、do - while 循环中跳出循环。
3.3.2 continue 语句
continue 结束本次循环,继续下一次的循环,只能使用在循环体内。
3.3.3 goto 语句
goto 语句不要跳出函数,在函数内跳转。
#include <stdio.h>
int main()
{
int a = 1, b = 2;
printf("start1\n");
if(a == 1)
goto err2;
printf("start2\n");
if(a == 2)
goto err1;
{
}
err1:
printf("stop2\n");
err2:
printf("stop1\n");
return 0;
}
四、数组基础
4.1 数组
数组是一种自定义数据类型,它是一段连续的内存空间,用来解决存储同类型的数据。
4.1.1 数组格式
数据类型 数组名称 [长度] //定义时必须确定长度。
4.1.2 数组初始化
1、定义时直接初始化
int csore[5] = {99, 91, 89, 100, 95};
int csore[] = {99, 91, 89, 100}; //默认数组长度,长度由初始化个数来决定
int csore[5] = {99}; //部分初始化,未初始化的默认为0
2、先定义后再初始化
int csore[5]; //必须指定数组长度
csore[0] = 99; //通过数组下标来指定初始化【下标为0 ~ (长度-1)】
csore[4] = 98;
4.1.3 数组特点
1、数组空间连续,存储同类型数据。
2、数组下标从0到(长度 - 1),超出这个访问就越界【数组允许越界】
3、数组名是一个地址,且是数组的首地址,也是第一个元素的地址【地址是常量】
【注:数组名是数组首元素的地址,但是有两个例外】
- sizeof(数组名)
- &数组名
4.1.4 生成随机数
#include <stdio.h>
#include <string.h>
#include <time.h>
int main()
{
int data[10] = {0};
srandom(time(NULL));
int num = random() % 100; //生成100以内的随机数
......
}