C语言学习记录
日期: 9.18~9.20
📖今日知识点 ——算术操作符
+ - */
%
💻练习代码
📖今日知识点 ——移位操作符
<<左移操作符,>>右移操作符
💻练习代码
//移位操作符
//左移操作符:左边丢弃,右边补0
//int main()
//{
// int a = 2;
// int b = a << 1;//a向左移一位,把a的二进制位向左移动一位.a—>00000000000000000000000000000010,b—>00000000000000000000000000000100=2^2=4
// printf(“b = %d\n”,b);//4
// return 0;
//}
//右移操作符:(正数右移算术右移和逻辑右移结果一样)
//算术右移:右边丢弃,左边补原(最左边原来的符号位,是0 or 1)符号位
//逻辑右移:右边丢弃,左边补0
//int main()
//{
// int a = 10;
// int b = a >> 1;//a向右移一位,把a的二进制位向右移动一位.a—>00000000000000000000000000001010,b—>00000000000000000000000000000101=4+1=5
// printf(“b = %d\n”,b);//5
// printf(“a = %d\n”,a);//10,a不变
// return 0;
//}
//负数右移
//存放在内存中,存放的是二进制的 补 码
//整数的二进制表示形式有三种:
//原码:直接根据数值写出的二进制序列就是原码
//反码:原码的符号位不变,其他位按按位取反就是反码
//补码:反码+1,就是补码
//例如-1的原码:10000000000000000000000000000001
//反码:11111111111111111111111111111110
//补码:11111111111111111111111111111111
//int main()
//{
// int a = -1;
// int b = a >> 1;//a向右移一位,把a的二进制位向右移动一位.a—>11111111111111111111111111111111,b—>11111111111111111111111111111111
// printf(“b = %d\n”,b);//-1,当前的右移操作符使用的是算术右移
// return 0;
//}
📖今日知识点 ——位操作符
&——按位与
- 口诀:全 1 才 1,有 0 则 0。
|——按位或
- 口诀:有 1 就 1,全 0 才 0。
^——按位异或
相同为 0,相异为 1
注:他们操作数必须是整数
💻练习代码
//aa=010101=000=0,相同为0
//a0=010000=010=a
int main()
{
int a = 3; int b = 5; //交换 a = a ^ b; b = a ^ b;//其实等价于b=a^b^b=a^0=a a = a ^ b;//其实等价于a=a^a^b=0^b=b printf("a = %d b = %d\n",a ,b); return 0;}
📖今日知识点 ——复合赋值操作符
+=
-=
*=
/=
%=
=
<<=
&=
|=
^=
💻练习代码
//注:= — 赋值
//== — 判断
//赋值操作符和复合赋值操作符
int mian()
{
int a = 100; a = 100; //1=2,效果一样 a = a + 100;//1 a += 100;//2 a = a >> 3; a >>= 3; return 0;}
📖今日知识点 —— 单目操作符
! 逻辑反操作
负值
正值
& 取地址
- sizeof 操作数的类型长度(以字节为单位)
对一个数的二进制按位取反
– 前置、后置–
++ 前置、后置++
间接访问操作符(解引用操作符)
(类型) 强制类型转换
💻练习代码
📖今日知识点 ——关系操作符
=
<
<=
!= 用于测试“不相等”
== 用于测试“相等”
注:=用于赋值,==用于判断
💻练习代码
//关系操作符
//int main()
//{
// int a = 3;
// int b = 5;
// //if (a == b)
// //if (a != b)
// //if (a > b)
// //if (a >= b)
// //if (a < b)
// if (a <= b)
// {
// printf(“hehe\n”);
// }
// return 0;
//}
//=用于赋值,==判断相等
//比较两个字符串相等,不能使用 ==
//字符串的“值”是什么?
//在 C 语言中,字符串本质是字符数组。
//当你写下数组名 s1 时,在大多数表达式里,它代表的是数组首元素的地址(指针)。
//char s1[] = “hello”;
//char s2[] = “hello”;
//s1 的值是一个内存地址(比如 0x1000)。
//s2 的值是另一个内存地址(比如 0x2000)
📖今日知识点 ——逻辑操作符
&& 逻辑与
<font style="color:rgb(249, 250, 251);background-color:rgb(44, 44, 46);">&&</font>(逻辑与):两边都为“真”时,结果才是 1(真)。
|| 逻辑或
`<font style="color:rgb(249, 250, 251);background-color:rgb(44, 44, 46);">||</font>`<font style="color:rgb(249, 250, 251);background-color:rgb(21, 21, 23);">(逻辑或):只要有一个为“真”,结果就是 1(真)</font>区分逻辑与和按位与 区分逻辑或和按位或
1&2 ------> 0(1 和 1 才为 1)
1&&2 ------> 1 (两边为真才是真)
1|2 ------> 3(有 1 就为 1)
1||2 -----> 1(一边为真就为真)
💻练习代码
📖今日知识点 ——三目操作符
exp1 ? exp2 : exp3
💻练习代码
//三目操作符
int main()
{
int a = 3; int b = 0; if (a > 5) b = 1; else b = -1; //三目操作符 //b = (a > 5 ? 1 : -1);//等价上面的if,else语句 return 0;}
📖今日知识点 ——下标引用操作符 []
[]、.、->
💻练习代码
//下标操作符
//int main()
//{
// int arr[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
// printf(“%d\n”,arr[4]);//5,[]就是下标引用操作符
// //[]的操作数是两个:arr,4(缺一不可)
// //3+5,+的两个操作数是3和5
// return 0;
//}
//函数的定义
//int Add(int x, int y)
//{
// return x + y;
//}
//void test()
//{
//}
//int main()
//{
// int a = 10;
// int b = 20;
// //函数调用
// int ret = Add(a, b);//() ---- 函数调用操作符,操作数有三个,Add(),参数a,参数b
// printf(“%d\n”,ret);
// test();
// return 0;
//}
//结构成员访问操作符
//.,结构体变量名.成员名
//->
//结构体
//int float char short
//double long
//
//书:书名,书号,出版社,作者,定价
//人:名字,年龄,性别
//创建一个自定义类型
struct Book
{
//结构体的成员(变量) char name[20]; char id[20]; int price;};//;不可或缺
int main()
{
// int num = 10;
struct Book b = {"C语言","C20260919",55}; struct Book * pb = &b; //结构体指针->成员名 printf("书名:%s\n",pb->name);//->操作符,可以找结构体成员变量 printf("书号:%s\n",pb->id); printf("定价:%d\n",pb->price);// printf(“书名:%s\n”,(*pb).name);//.操作符,可以找结构体成员变量
// printf(“书号:%s\n”,(*pb).id);
// printf(“定价:%d\n”,(*pb).price);
// printf(“书名:%s\n”,b.name);//.操作符,可以找结构体成员变量
// printf(“书号:%s\n”,b.id);
// printf(“定价:%d\n”,b.price);
return 0;}
📖今日知识点 ——隐式类型转换
C 的整型算术运算总是至少以缺省整型类型的精度来进行计算
为了获得这个精度,表达式中的字符和短整型操作数在使用之前被转换为普通整型,这种转换称为整型提升
💻练习代码##
📖今日知识点 ——操作符的属性
复杂表达式的求值有三个影响的因素
- 操作符的优先级
- 操作符的结合性
- 是否控制求值顺序
💻练习代码
📖今日知识点 ——数组习题
💻练习代码
//遍历数组为0 函数
void init(int arr[], int sz)
{
int i = 0; for (i = 0;i < sz;i++) { arr[i] = 0; }}
//一一打印数组 函数
void print(int arr[],int sz)
{
int i = 0; for (i = 0;i < sz;i++) { printf("%d ",arr[i]); } printf("\n");}
//将数组逆序,交换位置
void reverse(int arr[], int sz)
{
int left = 0; int right = sz - 1;//下标从0开始 while (left < right) { int tem = arr[left]; arr[left] = arr[right]; arr[right] = tem; left++; right--; }}
int main()
{
int arr[10] = {1,2,3,4,5,6,7,8,9,10}; int sz = sizeof(arr) / sizeof(arr[0]);//求数组长度 print(arr,sz);//1 reverse(arr,sz); print(arr,sz);//2 init(arr,sz); print(arr,sz);//3 return 0;}