格式化输入输出
函数名:printf()
格式控制符:%c //把数据转换成字符型 cahr
%d //把数据转换为有符号十进制整型 int short
%ld // long
%f //把数据转成单精度浮点型 flot
%d //double
%s //把数据转换为字符串
%p //地址
%m.nd // m 位宽 正数右对齐 负数左对齐,n 有效位
printf("%8d", 1234); //右对齐--- 1234
printf("%08d", 1234); //空位置补0---00001234
printf("%-8d", 1234); //左对齐---1234
printf("%.2f", 3.14159); //保留有效两位---3.15
printf("%f,%lf\n", 3.14,5.0); //3.140000,5.000000,保留六位小数
注意:printf在使用时,一定要加上\n
函数名:scanf()
scanf("%d%d", &a, &b);
注意:原样输入,不要忘记取地址符&,空格是默认的数据间隔符
缓冲区
printf()和scanf()使用了行缓冲
运算符
优先级15级,数字越小优先级越高
取值运算符:优先级 1
() [] -> .
单目运算符:优先级 2
- ! ++ -- sizeof
(类型)强制转换 &取地址 *解地址 ~安位取反
双目运算符:优先级 3~12
算数运算符:优先级 3~4
* / % + -
位移运算符:优先级 5
<< >>
关系运算符:优先级 6~7
> >= < <= == !=
逻辑运算符:优先级 8~12
& 按位与 遇0为0,遇1不变------>理解为*(乘法)
^ 按位异或 相同为0,不同为1
| 按位或 遇1为1,遇0不变------>理解为+(加法)
&& 逻辑与 前置条件为假,则后置条件不执行
|| 逻辑或 前置条件为真,后置条件不执行
三目运算符:优先级 13
? :
赋值运算符:优先级 14
= += -= *= /= %= ~=
<<= >>= &= ^= |=
逗号运算符:优先级 15
,
位运算
6个位运算符:~ << >> & ^ |
主要在MCU阶段,使用方法有固定公式,直接套用
清0
int a=?; //把第5位清0,其余位不变
???? ???? ???? ???? ???? ???? ???? ????
& 1111 1111 1111 1111 1111 1111 1101 1111
~ 0000 0000 0000 0000 0000 0000 0010 0000
a &= ~(0x01 << 5);
把第5~7位清0:a &= ~(0x07 << 5);
置1
int a=?; //把第8位清1,其余位不变
???? ???? ???? ???? ???? ???? ???? ????
| 0000 0000 0000 0000 0000 0001 0000 0000
???? ???? ???? ???? ???? ???1 ???? ????
a |= 0x01 << 8;
把第18~24置1:a |= ~(0x7F << 18); //0x7F == 0111 1111
把[20:16]设置为 10110:
a |= 0x1F << 16;
a &= ~(0x01 << 16);
a &= ~(0x01 << 19);
反转
每次执行代码,让对应位置取反
寄存器a第3位控制了一盏灯,当前灯是打开状态,但是不知道寄存器a中的值是什么,想要关灯,如何操作(把a中的第3位取反)
0^1 == 1 1^1 == 1 取反
0^0 == 0 1^0 == 1 不变
a ^ = 0x01 << 3;