news 2026/9/29 10:05:18

C语言操作符详解:从算术到位运算,一篇吃透所有运算符

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C语言操作符详解:从算术到位运算,一篇吃透所有运算符

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 的整型算术运算总是至少以缺省整型类型的精度来进行计算

为了获得这个精度,表达式中的字符和短整型操作数在使用之前被转换为普通整型,这种转换称为整型提升

💻练习代码##

📖今日知识点 ——操作符的属性

复杂表达式的求值有三个影响的因素

  1. 操作符的优先级
  2. 操作符的结合性
  3. 是否控制求值顺序

💻练习代码

📖今日知识点 ——数组习题

💻练习代码

//遍历数组为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;

}

📖今日知识点 ——

💻练习代码

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/29 9:59:28

嵌入式驱动开发培训机构避坑指南:识别伪驱动课程

做过十多年嵌入式开发&#xff0c;也带过不少新人&#xff0c;这几年收到私信里出现频率最高的问题&#xff0c;就是“怎么选嵌入式驱动开发培训机构”。打开招聘软件看一眼&#xff0c;嵌入式Linux驱动工程师的薪资在硬件岗里确实很能打&#xff0c;于是大量应用开发、纯单片机…

作者头像 李华
网站建设 2026/9/29 9:57:22

读Open Terminal源码:FastAPI+PTY如何把一台电脑变成REST API

读Open Terminal源码:FastAPIPTY如何把一台电脑变成REST API 【免费下载链接】open-terminal A computer you can curl ⚡ 项目地址: https://gitcode.com/gh_mirrors/ope/open-terminal Open Terminal 是一个轻量级的自托管终端 API&#xff1a;它用 FastAPI 做 HTTP 服…

作者头像 李华
网站建设 2026/9/29 9:56:49

UI 自动化踩坑记:一次被百度安全验证拦下的测试

报错在进行《实验案例1&#xff1a;百度搜索软件测试》时发现代码跑完assert "软件测试" in driver.title 测试报错断言期望&#xff1a;页面标题里包含“软件测试”。 实际结果&#xff1a;标题并没有包含软件测试即没有成功跳转调试反复确认代码编写没有错误在AI的…

作者头像 李华