PART 1 思维导图
Day5
一.常量
1.只能作为右值
运行过程中不能更改
2.整形常量
例:1,2,3,4
3.浮点型常量
例:3.14
4.字符型常量
例:’a’ ‘b’
5.字符串常量
例:”abc” “1234”
数据类型里没有字符串型 但是有字符串常量
6.宏定义常量
(1).无参宏
格式:#define 宏名 宏体
例:#define a 13(将a 定义为13,在程序里的a都为13)
(2).有参宏
格式:#define 宏名(参数1,参数2...参数3) 宏体
例:#define Max(a,b) a>b?a:b(输入Max(a,b)可比较a,b的大小)
(3).用于带参宏的参数
#define STR(n) #n
printf(“%s\n”,STR(hello));
prtinf语句在执行完预处理操作后会变为
printf("%s\n","hello");其中hello的””是#的功能
否则无法输出字符串hello
7.宏定义注意事项
1.定义在主函数上面,在头文件下面
2.宏名一般为大写方便与变量名区分
3.宏体尽量不要有语法错误,因为预处理阶段不会判断对错,宏体会直接替换,后导致报错
二.运算符
1.算数运算符
1.+ - *
2./ 例:a/b 两边皆为整数输出则是取整 只要有一个是浮点型则输出是浮点型
3.% 例:a%b 取余,4%3 = 1 两数都必须为整形
2.自增自减运算符
1.前自增:a++ a—
运算结果为a,自增前的结果,后续用到的a为自增后的结果
2.后自增:a++ a—
运算结果为a+1
3.例题:int a = 6;
printf(“%d %d”,a++,++a)
输出的两个%d分别为 7 8
运算过程:有两个有两个即以上运算时,先从右往左运算,++a令a变为7,然后a++输出的时自增前的值,所以输出7,然后将a++自增后的值赋给第二个%d输出
printf("%d %d\n",++a,a++);
输出的两个%d分别为 8 6
运算过程:一样先计算a++,但是输出的是自增前的数,所以第二个%d输出为6,经过a++后付给++a的a值为7,所以++a输出8
3.赋值运算符
1.= 就是C中的赋值运算符
左值:一般变量就是左值,左值是既可以放在赋值运算符左侧也可以放在赋值运算符右侧的值
右值:一般常量就是右值,右值是只能放在赋值运算符右侧的值
2.运算符 表达式 逻辑
+= a+=1 a=a+1
%= a%=1 a=a+1
4.条件运算符
1.C语言中唯一一个三目运算符
0为假其他全为真
2.格式
表达式1?表达式2:表达式3
执行逻辑: 如果表达式1成立,执行表达式2,否则执行表达式3
3.例:
b?a:b如果a大于b则输出a否则输出b
5.关系运算符
- 运算符 表达式 逻辑
>= >,<,<=
!= a!=b a,b不相等为真否则为假
== a==b a,b相等为真否则为假
6.逻辑运算符
1.运算符 表达式 逻辑
&& 表达式1&&表达式2 如果表达式1和2都是正确则为真
|| 表达式1||表达式2 表达式1和2只要有一个为真则为真
2.逻辑短路现象
a.逻辑与运算(&&)左侧的表达值为假,右侧不会执行
例:int a=1,b=2;
printf(”%d”,--a&&b++);//真,1
printf(“%d”,a);//0
printf(“%d”,b);//2
因为—a是0,则&&右侧不执行,b还是2;
b.逻辑或运算(||)左侧的表达值为真,右侧不会执行
例:int a=1,b=2;
printf(”%d”,a--||b++);//真,1
printf(“%d”,a);//0
printf(“%d”,b);//2
因为a—比较的a值还是1,则||右侧不执行,b还是2;
7.逗号运算符
1.格式:(表达式1,表达式2,表达式3)
可以有多个表达式,并且每一个表达式都会执行,获取最右侧一个表达式的结果
2.例:int n1 = 3,n2 = 9;
int c = (n1++,--n2,n2&&n1,n1+3); 先执行n1++n1->4,--n2令n2->8
printf("c=%d\n",c); n1(4)+4 = 7
printf("n1=%d\tn2=%d\n",n1,n2); n1(4) n2(8)
8.sizeof运算符
1.功能:求数据所占的字节数
2.例:sizeof(int)//4byte
char a[] = “abcde”
sizeof(a)/sizeof(char)//求字符串长度,5
9.位运算符
1.位运算符是对二进制进行操作的
1100 0101<<2 = 0001 0100
2.运算符 表达式 逻辑
>> a>>2 a右移2位,实际等于*2^2
<< a<<2 a左移两位,等于/2^2
& a&b 都为真,否则为假
| a|b 一个为真为真,否则为假
^按位异或 a^b 同0异1
`按位取反 `a 0011 ->1100
PART 2 如何交换两个数的值
#include<myhead.h>
int main(int argc, const char *argv[])
{
int a = 1,b = 2;
int c = a;
a = b;
b = c;
printf("%d %d\n",a,b);
return 0;
}
PART 3 已知unsigned int a; 在不改变其他bit的基础上,将a的第4个bit位置0;将a的第6个bit位置1,将a的第2个bit位取反(bit位默认从第0位开始)
#include<myhead.h>
int main(int argc, const char *argv[])
{
unsigned int a = 12;//0000 1100
a &= (2^8-1-2^4);//1110 1111令第四位为零
// 0000 1100 & 1110 1111 = 0000 1100
a |= 2^6;//0100 0000令第六位为0
// 0000 1100 | 0100 0000 = 0100 1100
a ^= (1 << 2);//0000 0100令第二位取反
// 0100 1100 ^ 0000 0100 = 0100 1000
}