本文共 7340 字,大约阅读时间需要 24 分钟。
九层妖塔 起于垒土
蓝桥杯杂记C51
二、C51
1、头文件
头文件是一种包含功能函数,数据接口声明 的载体文件,用于保存程序的声明。
2、main函数
main函数 ,又称主函数,是程序执行的起点。
3、数制
Keil似乎并不支持二进制数的直接输入。
4、移位运算符
①左移<<
0
填充空出的位置。 ●<<
该操作产生了一个新的值,但是不改变其运算对象的值。
test
为1,即0001,test<<2
为4,即0100,但是test
本身不变,仍为1.
●左移赋值运算符<<=
char test = 1; //0001test << 2; //表达式的运算结果为4,即0100;此时test=1;num = test << 2;//test = 1; num = 4;test <<= 2; //表达式的运算结果为4,此时test=4,0110;
②右移>>
0
填充空出的位置; ③移位运算符用于乘除法 number << n; //number乘以2的n次幂number >> n; //如果number为非负,则用number除以2的n次幂
5、for
语句
●一般形式:
for(表达式1;表达式2;表达式3) 循环体
●3个表达式的主要作用:
表达式1:设置初始化条件,只会在for循环开始时执行一次。 表达式2:循环条件表达式,用来判断是否继续循环。在每次执行循环体前,先执行此表达式。若此表达式为真,则继续执行循环;若为假,则循环结束。 表达式3:执行更新。在执行完循环体后才计算表达式3。 ●常用形式:for(循环变量赋初值;循环条件;循环变量增值) 循环体
循环体可以是以分号结尾的一条简单语句,也可以是花括号括起来的复合语句。
●流程图6、while
语句
●一般形式
while(表达式) 循环体
●先判断循环条件表达式,若为真即给定的条件成立,就执行循环体。
●流程图7、函数
①函数的定义
●定义无参函数类型名 函数名(void) { 函数体 }
函数体
包括声明部分
和语句部分
类型名 函数名(形式参数列表) { 函数体 }函数返回值的类型名 函数名(参数类型1 形参1,参数类型2 形参2,……) { 声明部分 语句部分 }
●定义空函数;即函数体为空
类型名 函数名() { }void dummy() { }
②调用函数
●三种函数调用的形式 ○函数调用语句//不要求函数带回值,只要求函数完成一定的操作。printf_star();
○函数表达式
//函数调用出现在另一个表达式中,这时要求函数带回一个确定的值以参加表达式的运算。c = 2*max(a,b); //max(a,b)是一次函数调用,它是赋值表达式的一部分。 //函数调用本身无分号
○函数参数
//函数调用作为另一个函数调用的实参。m = max(a,max(b,c)); //函数调用本身无分号printf("%d",maxc(a,b));
●函数调用时的数据传递
○形式参数,实际参数:单向传递,只能由实参传递给形参。 ●函数调用的过程 ○出现调用函数,函数的形参才被临时分配内存单元。 ○将实参的值传递给对应的形参。 ○执行函数,使用已经赋值过的形参参与运算。 ○通过return
语句将函数值带回到主调函数;若函数不需要返回值,则函数的类型应定义为void
类型,并且不需要return
语句。 ○调用结束,形参单元被释放;但实参单元仍然保留并维持原值。 ●函数的返回值 ○函数的返回值是通过函数中的return
语句获得的。 return 表达式;return(表达式);
当程序执行到return语句时,程序的流程就返回到调用该函数的地方,即 退出调用函数,并带回函数值。在同一函数内,可以出现多处return,以实现在函数体的不同部位退出函数。return语句只能执行一次。
○函数类型决定返回值的类型。
○不带返回值的函数函数应定义为“void
类型”(“空类型”) ●函数的声明: ○一般形式: 函数类型 函数名(参数类型1 形参1,参数类型2 形参2,……);
○在文件开头(所有函数之前,在主调函数的外部,在主函数的外部),对要调用的函数进行声明,称为外部声明。
8、运算符的优先级和结合性
运算符的优先级和结合性:
优先级 | 运算符 | 含义 | 运算对象的个数 | 结合方向 | 说明 |
---|---|---|---|---|---|
1 | ( ) | 圆括号 | 自左至右 | 初等运算符 | |
[ ] | 下标运算符 | ||||
2 | ! | 逻辑非运算符 | 1 (单目运算符) | 自右至左 | 单目运算符 |
~ | 按位取反运算符 | ||||
++ | 自加运算符 | ||||
-- | 自减运算符 | ||||
- | 负号运算符 | ||||
3 | * | 乘法运算符 | 2(双目运算符) | 自左至右 | 算术运算符 |
/ | 除法运算符 | ||||
% | 求余运算符 | ||||
4 | + | 加法运算符 | 2(双目运算符) | 自左至右 | |
- | 减法运算符 | ||||
5 | << | 左移运算符 | 2(双目运算符) | 自左至右 | 位运算符 |
[ ] | 下标运算符 | ||||
6 | < <= >>= | 关系运算符 | 2(双目运算符) | 自左至右 | 关系运算符 |
7 | == | (测试)等于运算符 | 2(双目运算符) | 自左至右 | |
!= | (测试)不等于运算符 | ||||
8 | & | 按位与运算符 | 2(双目运算符) | 自左至右 | 位运算符 |
9 | ^ | 按位异或运算符 | 2(双目运算符) | 自左至右 | |
10 | | | 按位或运算符 | 2(双目运算符) | 自左至右 | |
11 | && | 逻辑与运算符 | 2(双目运算符) | 自左至右 | 逻辑运算符 |
12 | || | 逻辑或运算符 | 2(双目运算符) | 自左至右 | |
13 | ? : | 条件运算符 | 3(三目运算符) | 自右至左 | 条件运算符 |
14 | =+=…… | 赋值运算符 | 2(双目运算符) | 自右至左 | 赋值算符 |
15 | , | 逗号运算符(顺序求值运算符) | 自左至右 | 逗号运算符 |
●初等→单目→算术→关系→逻辑→条件→赋值→逗号
●位运算符加圆括号 ●同一优先级的运算符,运算次序由结合方向决定。例:
- i ++
相当于 - (i ++)
●条件运算符: ○一般形式: 表达式1 ? 表达式2 : 表达式3
问号可以理解为:该往哪里走?
○流程图: ○例子://if else 表达形式if(a>b) max=a;else max=b;//将条件表达式的值赋值给maxmax = (a>b) ? a : b; //表达式2和表达式3是赋值表达式a > b ? (max=a) : (max=b);
9、变量的存储方式和生存期
●存储空间:程序区,静态存储区,动态存储区。
●变量按照作用域可以分为:局部变量,全局变量。 ●局部变量的存储类别: 1、自动变量(auto
)(动态局部变量): ○局部变量默认为自动变量,数据存储在动态存储区。 ○函数的形参;在函数中定义的局部变量;在复合语句中定义的局部变量。 ○离开函数,值就消失:在调用该函数时,系统会该这些变量分配动态存储空间,在函数调用结束时释放这些空间。 ○在函数调用时对自动变量赋初值,每调用一次函数重新给一次初值。 ○若在定义时不赋初值,自动变量的初值不确定。每次函数调用结束后存储单元已释放,下次调用时又重新另分配存储单元,而所分配的单元中的内容是不可知的。 2、静态局部变量(static
局部变量) ○离开函数,值任保留:数据存储在静态存储区,在程序整个运行期间都不释放。 ○在编译时赋初值,即只赋值一次,在程序运行时它已有初值。在以后每次调用函数时不再重新赋初值而只是保留上次函数调用结束时的值。 ○若在定义时不赋初值,则在编译时自动赋初值0(对数值型变量)或’\0’(对字符变量)。 ○其他函数不能引用静态局部变量,只能被本函数引用。 3、寄存器变量(register变量):存储在CPU中的寄存器中。 10、Keil C51编译器扩展的关键字
关键字 | 类型 | 作用 |
---|---|---|
bit | 位标量声明 | 声明一个位标量或位类型的函数 |
sbit | 可寻址位声明 | 定义一个可位寻址变量地址 |
sfr | 特殊功能寄存器声明 | 定义一个特殊功能寄存器(8位)地址 |
sfr16 | 特殊功能寄存器声明 | 定义一个16位的特殊功能寄存器地址 |
data | 存储器类型说明 | |
bdata | 存储器类型说明 | |
idata | 存储器类型说明 | |
pdata | 存储器类型说明 | |
xdata | 存储器类型说明 | |
code | 存储器类型说明 | |
interrupt | 中断函数声明 | 定义一个中断函数 |
…… |
11、C51数据类型
●数据类型分为基本数据类型和复杂数据类型
●C语言基本数据类型:char,int,short,long,float,double ●Keil C51编译器支持的数据类型 对于Keil C51编译器来说,short型与int型相同,double型与float型相同 Keil C51编译器支持的数据类型:数据类型 | 长度 | 值域(十进制) |
---|---|---|
unsigned char | 单字节 | 0~255 ( 2 8 2^8 28) |
char | 单字节 | -128~+127 ( 2 8 2^8 28) |
unsigned int | 双字节 | 0~65535 ( 2 16 2^{16} 216) |
int | 双字节 | -32768~+32767 |
unsigned long | 4字节 | 0~ 2 16 − 1 2^{16}-1 216−1 |
long | 4字节 | |
float | 4字节 | |
* | 1~~3字节 | 对象的地址 |
bit | 位 | 0或1 |
sfr | 单字节 | 0~255 |
sfr16 | 双字节 | 0~65535 |
sbit | 位 | 0或1 |
12、8051单片机特殊功能寄存器变量的定义
①8位地址特殊功能寄存器的定义
定义格式:sfr 特殊功能寄存器名 = 特殊功能寄存器的地址常数;//另一种表述sfr 标识符 = 地址;//例sfr P0 = 0X80; //定义特殊功能寄存器P0口的地址为80H
②16位特殊功能寄存器变量的定义
sfr16
③特殊功能寄存器中位变量的定义 sbit
可以对特殊功能寄存器中的位寻址变量进行定义。 sbit 位变量名 = 位地址sbit 位变量名 = 特殊功能寄存器名^位位置sbit 位变量名=字节地址^位地址
13、数据输出
(1)、 prinft
函数
prinft(格式控制,输出项1,输出项2,……)
②格式控制
●格式控制包括格式声明和普通字符 ●格式声明又称转换说明,由%
和紧跟其后的格式描述符
●格式控制中除了格式声明外,字符串中的其他字符(包括空格)将原样输出。 格式控制(转换说明) | 输出说明 |
---|---|
%d | 输出有符号十进制整数(正数不输出符号) |
%u | 输出无符号十进制整数(unsigned) |
%f | 浮点数,小数形式,输出十进制计数法 |
%c | 输出一个字符 |
%s | 输出字符串 |
%x | 以无符号十六进制形式输出整数 |
③输出列表:
●各个输出项之间由逗号隔开,可以是常量,变量,表达式。 ④格式声明修饰符: 在%
和格式描述符
之间插入修饰符可对基本的格式声明加以修饰。 标记 | 数字1 | .数字2 | 附加格式描述符 |
---|---|---|---|
5种标记可以不使用或使用多个标记 | 最小字段宽度如果该字段不能容纳待打印的数字或字符串,系统会使用更宽的字段 | 精度 | 在基本格式描述符的基础上,增加数据类型 |
●默认按照数据本身的实际宽度输出,前后不加空格,并采用右对齐的方式。
●数字1
: 为一整数常数,来指定输出的最小字段宽度。 ○若指定的宽度不够,输出时将会自动突破,保证数据完整输出。 ○若指定的宽度大于数据的实际宽度,输出时将会右对齐,左边补以空格,来达到指定的宽度。 ●.数字2
:
.数字2
的形式,即不指定总宽度,仅指定小数部分的输出位数 ○对于f,e或E,使用数字1.0
或.0
来不输出小数点和小数部分。 ○对于s(对于字符串),使用.数字2
的形式,来指定输出的最大宽度。若数字2 小于字符串的实际长度,则只输出字符串的前数字2 个字符。 ○对于整型数据,使用.数字2
的形式,与使用0数字1
的作用相同(此处0为标记)。此处的数字表示待打印数字的最小位数。若指定的宽度不够,输出时将会自动突破;若指定的宽度大于数据的实际宽度,则右对齐,左边补零。 ●数字1.数字2
:对于float和double类型的实数,可以使用数字1.数字2
的形式来指定输出宽度(数字1和数字2都为常整数)。数字1 指定输出数据的宽度(包括小数点);数字2 指定小数点后小数位的位数。
●标记
标记 | 含义 |
---|---|
- | 待打印项左对齐。即,从字段的左侧开始打印该项。 |
+ | 有符号值若为正,则在值前面显示加号;若为负,则在值前面显示减号。 |
空格 | 有符号值若为正,则在值前面显示前导空格(不显示任何符号);若为负,则在值的前面显示减号+标记覆盖一个空格 |
# | 把结果转换为另一种形式。如果是%o格式,则以0开始;若果是%x或%X格式则以0x或0X开始;(加上先导)对于所有浮点格式,#保证了即使后面没有任何数字,也打印一个小数点字符,如:%#8.0f ; |
0 | 对于数值格式,用前导0代替空格填充字段宽度。对于整数格式,如果出现-标记或指定精度,则忽略该标记。%010d 和%0.83f |
⑤格式声明的意义
●格式声明把以二进制格式储存在计算机中的值转换为一系列的字符(字符串)以便于显示。 ●格式声明是一个翻译的意思,%d
的意思是“把给定的值翻译成十进制整数文本并打印出来。” ●例:数字76在计算机内部的存储格式为二级制数01001100。 %d
格式声明将其转换成字符7和6,并显示为76; %x
格式声明把相同的值(01001100)转换为十六进制的4c; %c
格式声明把01001100转换成字符L(ASCII码) 。 14、全局变量,形参,局部变量的作用域
●全局变量的使用相当于为函数之间的数据传递另外开辟了一条通道。
●若全局变量和某个函数中的局部变量同名,则在该函数中,此全局变量被屏蔽,在该函数内,访问的是局部变量,与同名的全局变量不发生任何关系。15、字符型数据
●ASCII码(美国信息交换标准代码):共127个
●字符常量:用单引号括起来,在内存中占一个字节,字符常量只能包含一个字符。 ●转义字符常量:用单引号括起来,以一个反斜线开头后跟一个特定的字符。 ●字符串常量:用双引号括起来;系统在每个字符串的最后自动加入一个字符\0
作为字符串的结束标志; ●字符变量:在内存中占一个字节,可以存放ASCII字符集中的任何字符。当把字符放入字符变量中时,字符变量中的值就是该字符的ASCII代码值,所以字符变量可以作为整形变量来处理,可以参与对整形变量所允许的任何运算。 ●字符1
与整数1
: ○字符1
只是代表一个一个形状为1
的符号,在需要时按照原样输出,在内存中以ASCII码的形式存储,占一个字节。 ○字符1
的ASCII为49,内存:[00110001]
○整数1
是以整数存储方式(二进制补码)存储的,占2个或4个字节。 ○整数1
,内存:[00000000]
[00000001]
○整数运算1+1=整数2;而字符1
+1
并不等于整数2或者字符2
。 ● char code = 'C';prinft("%d %c\n",code ,code );输出结果为:67 C
○一个字符变量实际上被储存为1个字节的整数值。
○用%d
转换说明打印char类型变量的值,打印的是一个整数。 ○而%c
转换说明打印该整数值对应的字符。 16、字符串
(1)、用一维字符数组存放字符串
①存放: ●以字符\0
作为字符串结束标志。\0
作为标志占用存储空间,但不计入字符串的实际长度。 ●C编译系统以字符串常量的形式给出存放每一个字符串的存储空间的首地址。 17、sprintf()
函数
●功能:将数据写入字符串,把多个元素组合成一个字符串。
●函数声明:sprintf()
函数声明在stdio.h
中。 ●格式: sprintf(string, format ,输入项1,输入项2,输入项3,……);
○string
:为目标字符串的地址。为存放字符串的一维数组名。数组名是数组首元素的地址。数组表示法其实是在变相地使用指针。 ○format
:以字符串形式呈现的格式控制。 18、数组
●一般形式:
//定义:类型符 数组名[常量表达式]//常量表达式为数组中元素的个数//引用:数组名[下标]
●C语言不允许对数组的大小作动态的定义,即数组的大小不依赖于程序执行过程中变量的值。
●数组的初始化 ○若数组长度大于已赋值元素个数,则在后端补0(字符型数组,补\0
;指针型数组,补NULL
,即空指针)。 int a[[10] = { 1,2,3,4,5};
●在定义时若未初始化数组内容,即数组内容为空,则必须指定数组大小。
转载地址:https://methadone-no1.blog.csdn.net/article/details/107957943 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!