作业:
- 整理思维导图
- 将data中的第[7:4]位置1,保持其他位不变。[7:4]表示4-7bit位
#include <stdio.h> int main(int argc, const char *argv[]) { int data; printf("%d\n",data|(0xf<<4)); return 0; }
- 思考如何交换两个数
#include <stdio.h> int main(int argc, const char *argv[]) { int a = 0; int b = 0; printf("请输入a、b两个数:"); scanf("%d%d",&a,&b); #if 0 int temp = 0; temp = a; a = b; b = temp; #endif #if 0 a = a+b; b = a-b; a = a-b; #endif #if 1 a = a^b; b = a^b; a = a^b; #endif printf("交换后 a = %d b = %d\n",a,b); return 0; }
- 把课上位运算的第2题,再整理一遍
有unsigned char a; 1111 1111 ---->bit默认从0开始 给a的第6个bit置1--->或 a | 0100 0000 a|(0x1) 给a的第4个bit置0--->与 a & 1110 1111 ~(0001 0000) = 1110 1111 a&~(0x1) 给a的第5个bit取反--->异或 (同0异1) a ^ 0010 0000 a^(0x1)
目录
七、输入输出函数
【1】标准输出函数
双引号内有一个格式符,逗号后面就要有一个输出表象
格式符之间以逗号作为分隔,每个输出表象以逗号作为分隔
printf("格式符+转义字符",输出表象);
函数原型:
int printf(const char *format, ...);
printf的使用:
双引号中的内容原封不动输出
格式符:
%d,十进制输出有符号数
%ld,十进制输出有符号长整型
%f,输出float类型
%lf,输出double类型
%c,输出字符类型
%s,输出字符串
%u,无符号输出整形的十进制
%#X/x:输出十六进制(无符号) ----->#输出前导符
%#o:输出八进制(无符号)
%.nf:输出小数点后n位,不足补0
%nd:以n个数据宽度靠右对齐输出,不足补空格,超出全部输出
%-nd:以n个数据宽度靠左对齐的输出,不足补空格,超出全部输出
%p:输出内存地址的
转义字符:
\n:换行
\t:制表符
\r:回车,回到当前行的首位进行输出
\b:后退一格,回到上一个位置进行输出
【2】标准的输入函数
scanf获取数据时,以空格、tab键和回车作为数据之间的分隔,
回车在缓冲区内数据个数>=格式符个数时,回车是结束的标志
函数原型:
int scanf(const char *format, ...);
使用:
scanf("格式符",变量的地址);
注意事项:
1、逗号后面的内容,是变量的地址
2、scanf的双引号内不要加\n
3、scanf是严格控制格式的函数,终端输入的格式要和双引号内的格式严格一致
使用带参宏完成加法、减法、除法和乘法的功能,要求传入的参数从终端获取。
#include <stdio.h>
#define ADD(a,b) a+b
#define SUB(a,b) a-b
#define MUL(a,b) a*b
#define DIV(a,b) a/b
#define FUN a*b
int main(int argc, const char *argv[])
{
int var1,var2;
scanf("%d%d",&var1,&var2); //实现var1和var2的终端输入
printf("%d\n",ADD(var1,var2));
//给带参宏浮点型的参数
float num1,num2;
scanf("%f%f",&num1,&num2);
printf("%.3f\n",SUB(num1,num2));
printf("%.3f\n",DIV(num1,num2));
printf("%.3f\n",MUL(num1,num2));
//printf("%d\n",FUN);
//a*b 要求程序中有a和b两个变量
return 0;
}
scanf连续获取字符时需要吸收垃圾字符
只有%c获取数据的情况下需要吸收垃圾字符
#include <stdio.h>
int main(int argc, const char *argv[])
{
char c1,c2,c3;
scanf("%c%c%c",&c1,&c2,&c3);
printf("c1=%c\n",c1);
printf("c2=%c\n",c2);
printf("c3=%c\n",c3);
return 0;
}
i)使用scanf严格控制格式的特点吸收垃圾字符
#include <stdio.h>
int main(int argc, const char *argv[])
{
char c1,c2,c3;
//利用scanf严格控制格式的特点
//终端输入的空格,会被双引号的空格格式吸收
scanf("%c %c %c",&c1,&c2,&c3);
printf("c1=%c\n",c1);
printf("c2=%c\n",c2);
printf("c3=%c\n",c3);
return 0;
}
ii)在%c前面加空格
#include <stdio.h>
int main(int argc, const char *argv[])
{
char c1,c2,c3;
//在可能出现垃圾字符的位置放空格,空格会吸收掉所有的垃圾字符
scanf("%c",&c1);
scanf(" %c",&c2);
scanf(" %c",&c3);
printf("c1=%c\n",c1);
printf("c2=%c\n",c2);
printf("c3=%c\n",c3);
return 0;
}
iii)通过抑制字符吸收
%*c:吸收一个字符但是不会获取给任何变量
不建议使用%*C,一定会吃掉一个字符
#include <stdio.h>
int main(int argc, const char *argv[])
{
char c1,c2,c3;
//利用scanf严格控制格式的特点
scanf("%c%c%c",&c1,&c2,&c3);
/*printf("c1=%c\n",c1);
printf("c2=%c\n",c2);
printf("c3=%c\n",c3);*/
//在可能出现垃圾字符的位置放空格,空格会吸收掉所有的垃圾字符
/*scanf("%c",&c1);
scanf(" %c",&c2);
scanf(" %c",&c3);*/
//通过抑制字符%*c吸收垃圾字符
//scanf("%c%*c%c%*c%c",&c1,&c2,&c3);
printf("c1=%c\n",c1);
printf("c2=%c\n",c2);
printf("c3=%c\n",c3);
return 0;
}
iv)使用getchar吸收垃圾字符
#include <stdio.h>
int main(int argc, const char *argv[])
{
char c1,c2,c3;
//利用scanf严格控制格式的特点
//scanf("%c%c%c",&c1,&c2,&c3);
/*printf("c1=%c\n",c1);
printf("c2=%c\n",c2);
printf("c3=%c\n",c3);*/
//在可能出现垃圾字符的位置放空格,空格会吸收掉所有的垃圾字符
/*scanf("%c",&c1);
scanf(" %c",&c2);
scanf(" %c",&c3);*/
//通过抑制字符%*c吸收垃圾字符
//scanf("%c%*c%c%*c%c",&c1,&c2,&c3);
//使用getchar吸收垃圾字符
//每用%c获取一个字符后,都加入一个getchar吸收掉空格、tab或者回车
scanf("%c",&c1);
getchar();
scanf("%c",&c2);
getchar();
scanf("%c",&c3);
printf("c1=%c\n",c1);
printf("c2=%c\n",c2);
printf("c3=%c\n",c3);
return 0;
}
【3】单个字符的输入函数getchar()
函数原型:
int getchar(void);
返回值:字符的ASCII码
参数:(void),没有参数
功能:
从终端获取单个字,并返回该字符ASCII码
【4】单个字符的输出函数putchar()
函数原型:
int putchar(int c);
返回值:int
参数:int c ----->要输出的字符的ASCII码
功能:
输出单个字符
putchar(10); ---->\n换行
八、运算符
【1】算数运算符
运算符 | 格式 | 功能 |
+ - * | a+ - * b | 两数相加、相减和相乘 |
/ | a/b | 如果运算符两侧的操作数都是整型,就是取整操作 如果运算符两侧有一个操作数时浮点型,结果就是整除 |
% | a%b | 取a/b的余数部分 要求两个操作数都是整型 |
【2】赋值运算符
=是赋值运算符,=左侧叫左值,=右侧叫右值
运算符 | 格式 | 功能 |
= | a=b | 把b的值赋给a |
+= | a+=b | a=a+b,把a+b的结果赋值给a |
*= | a*=b | a=a*b,把a*b的结果赋值给a |
··· | ··· | ··· |
【3】自增自减运算符
a++、++a、a--、--a
a++和++a都可以实现a的自增。
观察运算符先出现还是变量先出现
运算符先出现,拿到的就是运算后的结果
变量先出现,拿到的就是变量本身的值
【4】关系运算符
关系运算的结果,非真即假,非0即1
计算机中真假如何表示?0为假,非0为真
运算符 | 格式 | 功能 |
== | a==b | 判断两数是否相等 |
!= | a!=b | 判断两数是否不相等 |
>、>= | a>=/>b | 判断a是否大于b,a大于等于b |
终端输入一个三位数,输出该三位数的个位、十位和百位
#include <stdio.h>
int main(int argc, const char *argv[])
{
int num;
scanf("%d",&num);
printf("个位:%d\n",num%10);
printf("十位:%d\n",num/10%10);
printf("百位:%d\n",num/100);
return 0;
}
【5】逻辑运算符
逻辑运算的结果,非真即假,非0即1
运算符 | 格式 | 功能 |
&& | a&&b | 逻辑与 如果运算符两侧的表达式都为真,结果才为真 |
|| | a||b | 逻辑或 如果运算符两侧的表达式有一个为真,结果就为真 |
! | !a | 非 a=0,!a=1 a为非0数,!a为0 |
逻辑短路现象
逻辑与,如果左侧表达式结果为假,逻辑运算的结果为假,右侧的表达式不会执行
逻辑或,如果左侧表达式结果为真,逻辑运算的结果为真,右侧的表达式不会执行
#include <stdio.h>
int main(int argc, const char *argv[])
{
int a=9,b=0;
printf("%d\n",a+b&&b||b++);
//--b没有执行
printf("%d\n",a+b&&++b||--b);
printf("%d\n",b);
//前面b=2,!b=0 !a,b++不会执行 ,--a执行 a=8
printf("%d\n",!b&&!a&&b++||--a);
printf("a=%d\tb=%d\n",a,b);
return 0;
}
【6】条件运算符
是C语言中唯一一个三目运算符
表达式1?表达式2:表达式3
执行逻辑:
如果表达式1成立,执行表达式2,否则执行表达式3
a>b?a:b --->如果a>b,返回a,否则返回b
【7】逗号运算符
(表达式1,表达式2,表达式3,·····)
执行逻辑:从左至右每一个表达式都会执行,取最右侧表达式的结果
【8】sizeof运算符
sizeof,是C语言中的一个关键字
求数据的大小,以字节为单位
sizeof()的结果,64位,unsigned long int;
32位,unsigned int;
使用:
sizeof(数据);
#include <stdio.h>
int main(int argc, const char *argv[])
{
printf("int的大小=%ld\n",sizeof(int));
printf("double的大小=%ld\n",sizeof(double));
printf("char的大小=%ld\n",sizeof(char));
return 0;
}
【9】位运算符
位运算是对二进制位进行操作的
运算符 | 格式 | 功能 |
>> | a>>3,a按位右移三位 | 右移运算符,高位补0 |
<< | a<<3,a按位左移三位 | 左移运算符,低位补0 |
& | a&b,两个bit都为1时,结果为1,否则为0 | 按位与 |
| | a|b,两个bit都为0时,结果为0,否则为1 | 按位或 |
^ | a^b,同0异1 | 按位异或 |
~ | ~a,对a的每一个bit位取反 | 按位取反 |
a = 0000 1010;
a >> 3 = 0000 0001 = 1 a
0000 0011
0000 0001 & = 0000 0001
0000 0011
0000 0001 | = 0000 0011
0000 0011
0000 0001 ^ = 0000 0010 (同0异1)
位运算的口诀:
0与任何数都是0,与运算用于给某一位置0
1或任何数都是1,或运算用于给某一位置1
0异或任何数都数本身,1异或任何数都是取反
有unsigned char a; 1111 1111 ---->bit默认从0开始
给a的第6个bit置1--->或 a | 0100 0000 a|(0x1)
给a的第4个bit置0--->于 a & 1110 1111 ~(0001 0000) = 1110 1111 a&~(0x1)
给a的第5个bit取反--->异或 (同0异1) a ^ 0010 0000 a^(0x1)
【10】运算符的优先级
()优先级最高
口诀:单算移关与 异或逻条符 逗号运算符的优先级最低