最小的存储单元是比特
最小可寻址单元是是 字节
八个比特组成一个 字节
二进制如何表示正负
1.对于有符号数,最高位被计算机系统规定为符号位,0 为正,1为负
2.对于无符号数,最高为被计算机系统规定为数据位
例子
+1 = 0000 0000 0000 0001(最高位0表示整数)
-1 = 1000 0000 0000 0001(最高位1表示负数)
其中+1-1叫做真值,二进制数叫做机器数
数字 在计算机中 用二进制补码的形式来存储
如何计算补码
整数 原码 反码 补码 都一样
负数 反码 = 符号位不变 其他位取反
补码 = 反码 +1
-1的原码:1000 0000 0000 0001
取反:1111 1111 1111 1110
-1的补码:1111 1111 1111 1111
补码转回原码 = 补码符号位不变,数据位取反,尾+1;
-1的补码:1111 1111 1111 1111
取反:1000 0000 0000 0000
-1的原码:1000 0000 0000 0001
数据类型 整形,字符型char 及实型。其中整形分为 短整型short整形int长整形long 实型分为 单精度型float 双精度型double
auto :声明自动变量 break:跳出当前循环 case:开关语句分支
char :声明字符型变量或函数返回值类型 const :声明只读变量 continue:结束当前循环,开始下一轮循环 default:开关语句中的“其它”分支
do :循环语句的循环体
double :声明双精度浮点型变量或函数返回值类型
else :条件语句否定分支(与 if 连用)
enum :声明枚举类型 extern:声明变量或函数是在其它文件或本文件的其他位置定义 float:声明浮点型变量或函数返回值类型
for:一种循环语句
分区 第二天 运算v7.0(@传智播客-萧四无) 的第 93 页
goto:无条件跳转语句
if:条件语句
int: 声明整型变量或函数
long :声明长整型变量或函数返回值类型 register:声明寄存器变量
return :子程序返回语句(可以带参数,也可不带参数) short :声明短整型变量或函数 signed:声明有符号类型变量或函数 sizeof:计算数据类型或变量长度(即所占字节数) static :声明静态变量
struct:声明结构体类型
switch :用于开关语句 typedef:用以给数据类型取别名 unsigned:声明无符号类型变量或函数 union:声明共用体类型
void :声明函数无返回值或无参数,声明无类型指针 volatile:说明变量在程序执行中可被隐含地改变 while :循环语句的循环条件
auto :声明自动变量 break:跳出当前循环 case:开关语句分支
char :声明字符型变量或函数返回值类型 const :声明只读变量 continue:结束当前循环,开始下一轮循环 default:开关语句中的“其它”分支
do :循环语句的循环体
double :声明双精度浮点型变量或函数返回值类型
else :条件语句否定分支(与 if 连用)
enum :声明枚举类型 extern:声明变量或函数是在其它文件或本文件的其他位置定义 float:声明浮点型变量或函数返回值类型
for:一种循环语句
goto:无条件跳转语句
if:条件语句
int: 声明整型变量或函数
long :声明长整型变量或函数返回值类型 register:声明寄存器变量
return :子程序返回语句(可以带参数,也可不带参数) short :声明短整型变量或函数 signed:声明有符号类型变量或函数 sizeof:计算数据类型或变量长度(即所占字节数) static :声明静态变量
struct:声明结构体类型
switch :用于开关语句 typedef:用以给数据类型取别名 unsigned:声明无符号类型变量或函数 union:声明共用体类型
void :声明函数无返回值或无参数,声明无类型指针 volatile:说明变量在程序执行中可被隐含地改变 while :循环语句的循环条件
标示符:程序员在程序中自定义的一些符号和名称
标示符命名规范
1只能由字母、数字、下划线或者美元符号$组成
2不能以数字开头
3不能与关键字重名
4严格区分大小写
常见的运算分类:算数运算,关系运算、逻辑运算、按位运算。
算术运算就是:加减乘除
逻辑运算:与或非
关系运算:比较大小 相等 不相等
按位运算:精确到bit一级的运算
表达式就是由运算符、常量及变量构成
所有的表达式都是有结果的,可以作为返回值
求余运算
左边数字的绝对值如果小于右边的绝对值那么结果是左边。
左边数字的绝对值如果是右边数字绝对值的倍数,那么结果是0
左边数字的绝对值如果大于右边数字的绝对值,那么结果是正常余数
求余:操作数必须是整数,获取余数。运算结果的正负与第一个数字相同
算数中的类型转换分为两类:自动转换(隐士转换),强制转换(显示转换)
为什么char类型先转化成int类型呢
在内存中字符的存储实际上是把字符相对应的ASCLL代码放到存储单元中的。而这些ASCLL代码值在计算机中也是以二进制形式存放的。这个与整形的存储很形似。因此这两类之间的转换也比较方便
强制转换表达式
(类型说明符)(表达式)
+= 加后赋值 变量+=表达式 如:a+=3;即a=a+3 -= 减后赋值 变量-=表达式 如:a-=3;即a=a-3
前缀 后缀的概念
把运算符++或者 - - 放在前面如++a就叫前缀运算符,先执行运算符的运算,在用操作数干指定操作,反之叫做后缀运算符 先用操作数干指定操作,再执行运算符的运算
自增和自减只能用于单个变量,不能用于表达式或常量
sizeof运算符
sizeof:单目运算符
用途:获取操作数占用内存大小的字节数
使用形式:sizeof(数据类型)
逻辑运算有个短路为题 &&短路只要一个条件为假,后面表达式就不参与运算了
||短路:只要一个条件为真,后面的表达式就吧参与运算了
进制转换(了解)
10 -> 2 : 除2取余法,把10进制数除以2,然后取得余数的序列,再倒序 2 -> 10 : 所有位的位权相加 101 = 1*2^0+0*2^1+1*2^2
2 --> 16 : 4合1法, 整数部分从右向左 4位结合成一位,小数部分从左向右4位结合1位, 不足 部分补0
16 -->2 : 1拆4法, 16进制的1位拆成二进制的4位 2-->8 :3合1
8-->2 :1拆3
10-->8 :除8取余 8-->10: 8-->2-->10 16 --> 10: 16 -->2 -->10 (128页)
位运算 用途:直接操作二进制,省内存,效率高
只能用于整形操作数(char,short,int,long)
1.&按位与 全1才1,否则0
9&12 = 9
1 0 0 1
& 1 1 0 1
———————————
1 0 0 1 = 9
2. |按位或 有1就1
3.^ 按位异或 不同为1
9^13 = 4;
4. ~取反 先各二进位进行取反后(0边1,1变0)符号位跟着一块算
~9 = -10
~9 =-10
1001
~
--------------
0110
0 1001
1 0110
原码 = 补码的符号位不变 ---》 数据位取反 -->位数加1 1 1001
11010 《-----原码-10
5.《左移 各二进制玩不左移n位,高位丢弃,地位补0;左移会改变一个数的正负性;左移1相当于*2;左移用途,快速计算一个数乘以2的n词方(8《3 等同于8*2^3)
移除位砍掉,移进的位补零
6.》右移 各二进位全部右移n位,保持符号位不变
移出的位删掉,移进补符号号位
右移相当于除以2的n次方(8》等同于8/2^3)
运算技巧
1)任何数和1进行&操作,得到这个数的最低位 数字&1 =数字的二进制形式的最低位
三目运算符
基本格式 (关系表达式)?表达式1:表达式2;执行流程 如果表达式为真返回表达式1,如果表达式为假,返回表达式2;
程序控制流程 分类:顺序结构,选择结构,循环结构
1、Switch分支语句:
1)使用格式
switch(变量){
case 常量表达式1:
语句1;
break;
case 常量表达式2:
语句2;
break;
case 常量表达式n:
语句n;
break;
default:
语句n+1;
break;
}
执行顺序 : 计算表达式A的值 a
a顺序与常量表达式1,2..n的值比较。 遇到与a相等的值,则执行对应的语句,执行语句完毕,遇到break,跳 出switch块。
若a与所有常量表达式的值都不相等。
则执行 default对应的 语句n+1, 执行完毕遇到break,跳出switch块。
case后面只能是常量,或者常量表达式
do while 和 while循环的区别在于while是先判断循环条件,再循环,而do —white是先执行后判断,所以即使表达式为假也会执行一次
函数分为 库函数和用户定义函数
函数的基本格式
函数的定义到使用分三步1.声明,2实现(定义)函数3.调用函数
返回值类型 函数名称 (数据类型 变量名1,数据类型 变量名2...){
函数体
return 对应类型的结果;
}
全局变量说明
(1)外部变量定义必须在所有的函数之外,且只能定义一次
(2)在同一源文件中,允许全局变量和局部变量同名,在局部变量的作用域内全局变量不起作用(强龙不压地头蛇)。
因为存储在不同片区
代码区 函数代码
静态存储区 全局变量,静态变量
堆区 动态内存
栈区 局部变量、函数形参等
(3) 如果外部变量定义在某函数的下面,则要使用该外部变量的时候一定 要进行说明
外部变量说明的一般形式为:
extern 类型说明符 变量名,变量名,...;
(4)在整个程序内,可以出现多次外部变量的说明,但是外部变量在说 明的时候 不能再赋初始值
外部变量在定义时就已分配了内存单元,外部变量定义可作可作初始赋值, 在说明的时候只是表明在函数内要使用某外部变量。
(5)外部变量可加强函数模块之间的数据联系,但是又使函数要依赖这些变 量,因而使得函数的独立性降低。从模块化程序设计的观点来看这是不利 的, 因此在不必要时尽量不要使用全局变量。
#include指令
文件包含是C预处理程序的另一个重要功能。作用是告诉编译器我们要使用哪个“工具箱”中的工具了。
#include有两种情况
(1)“”是用户定义的文件,可以是头文件,也可是普通文件
(2)<>是包含了一个系统的头文件
注意include语句后面不需要加分号,因为他是一个预处理指令,不是一个语句
#include文件搜搜顺序
当前文件夹—>编译器include文件夹——>系统include文件夹——>如果找不到报错
数组的一般形式
类型说明符 数组名[常量表达式];
数组中的元素是从0开始的,不能在方括号中,用变量最为元素个数,但是可以是常量或者常量表达式
数组初始化是在编译阶段进行的,这样将减少运行时间,提高效率。
静态初始化:定义的同时是初始化
动态初始化:先定义,后初始化
常见的形式
类型说明符 数组名[常量表达式]={值,值,值,值…};
指定元素的个数,同时对所有的元素进行显式的初始化
int nums[3] = {10,11,12};
不指定元素个数,同时对所有的元素进行显式的初始化。(它是根据大括号中的元素的个 数来确定数组的元素的个数 )
int nums[] = {10,11,12};
指定元素个数,同时给指定元素进行初始化标号。
int nums[3] = {[0] = 3,[1] = 2};
指定元素个数,对数组进行部分显式初始化
int nums[3] = {4};
数组首地址与与第一个元素地址相同
数组的总字节数 = sizeof(数组名)
数组的长度(元素个数)= sizeof(数组名)/sizeof(数据类型);
字符串
字符串\0结束,所占字节比实际多一个
字符串的定义
char 数组名[常量表达式]
二维数组
char 数组名[常量表达式1][常量表达式2]
注意:定义数组的时候应确保数组长度比字符串长度至少多一位
字符数组初始化
(1)char c[4]={‘d’,’e’,’d’}
(2)char c2[4]={“awe”}
(3)char c3[4]=“qwe”
未被使用的元素均被自动初始化为\0
%s进行输出字符数组
因为数组名就首地址,因此在输出时数组名不用加&
不指定数组长度,要计算数组长度用while循环,因为结果就是要循环次数,判断条件不等于‘\0’
1、 字符串输出函数:puts 可以自动换行
2、字符串输入函数:gets 接受空格
3、字符串连接函数:strcat
0)strcat 函数介绍,使用该函数必须要引入头文件
1)格式:strcat(oldStr,newStr);
2) oldStr的长度要足够到,只要能够保存下oldStr+newStr
3) newStr 把oldStr的最后一个字符\0给覆盖了
字符串拷贝函数strcpy
strcpy(字符数组名1,字符数组名2) 功能:把字符数组2中的字符串拷贝到字符数组1中。串结束标志“\0”也一同拷贝。字符数名 2, 也可以是一个字符串常量。这时相当于把一个字符串赋予一个字符数组。
字符串比较函数strcmp
格式: strcmp(字符数组名1,字符数组名2) 功能:按照ASCII码顺序比较两个数组中的字符串,并由函数返回值返回比较结果。 字符串1=字符串2,返回值=0;
字符串1>字符串2,返回值>0;
字符串1<字符串2,返回值<0。
测字符串长度函数strlen
格式: strlen(字符数组名)
功能:测字符串的实际长度(不含字符串结束标志‘\0’)并作为函数返回值。
指针
用一个变量去存储指针, 这样的变量叫指针变量。
指针变量定义的一般形式:
基类型 * 指针变量名;