当前位置: 首页 > news >正文

【C语言】第5站-运算符

文章目录

  • 一、算数运算符
      • 加、减、乘、除、求余、自加、自减
  • 二、关系运算符
      • 大于、小于、等于、大于等于、小于等于、不等于
  • 三、逻辑运算符
      • 非、与、或
  • 四、位运算符
      • 左移、右移、取反、或、异或、与
        • 1、关于寄存器某些位进行 `置 1 置 0 取反`操作
        • 2、使用异或交换两个整数
        • 2、移位操作符(>>(右移)、<<(左移))
        • 3、按位取反(~a)
        • 4、位操作符(&(与)、|(或)、^(异或))
  • 五、赋值运算符
      • 赋值
  • 六、条件运算符(三目运算符)
      • 三目运算
  • 七、逗号运算符
      • 逗号表达式
  • 八、指针运算符
      • 取内容、取地址
  • 九、求字节运算符(sizeof)
      • 求字节
  • 十、强制类型转换运算符
      • 强制类型转换
  • 十一、分量运算符
      • 结构体成员的两种引用方式
  • 十二、下标运算符
      • 数组下标
  • 十三、其他
      • 函数调用运算符
  • 十四、转义字符
  • 运算优先级

一、算数运算符

加、减、乘、除、求余、自加、自减

+-*/%++--

除法运算符( / )

a、两个整数相除时,结果取整数
b、若其中有一个是浮点数时,结果为浮点数

求模运算符( % )

只能为两个整数,且结果为整数,如:10%3=1

自加与自减运算符(++ 或 --

a、只能用于变量
b、(++i)表示先自加,完成后再参与运算,(i++)表示先参与运算,完成后再自加 (--同理 )

二、关系运算符

大于、小于、等于、大于等于、小于等于、不等于

><==>=<=!=

注意(==)与(=)的区别,前者是进行比较,后者是进行赋值

三、逻辑运算符

非、与、或

!&&||

逻辑与(&&):

  • 全真为真,有假则假
  • 短路:若前面为假,则后面表达式不计算

逻辑或( || ):

  • 有真为真,全假为假
  • 短路:若前面为真,则后面表达式不计算

注:

  • && 的优先级高于 ||
  • 计算机中非0为真
  • 对于逻辑运算:真为1,假为0
voidstart(){inti=0,a=0,b=2,c=3,d=4;i=a++&&++b&&d++;// 0 不算 不算printf("i = %d a = %d b = %d c = %d d = %d\n",i,a,b,c,d);// 0 1 2 3 4i=0,a=0,b=2,c=3,d=4;i=a++||++b||d++;// 0 3 不算printf("i = %d a = %d b = %d c = %d d = %d\n",i,a,b,c,d);// 1 1 3 3 4i=0,a=1,b=2,c=3,d=4;i=a++&&++b&&d++;// 1 3 5printf("i = %d a = %d b = %d c = %d d = %d\n",i,a,b,c,d);// 1 2 3 3 5i=0,a=1,b=2,c=3,d=4;i=a++||++b||d++;// 1 不算 不算printf("i = %d a = %d b = %d c = %d d = %d\n",i,a,b,c,d);// 1 2 2 3 4}

四、位运算符

左移、右移、取反、或、异或、与

<<>>~|^&
符号说明
&有 0 为 0,全 1 为 1
|有 1 为 1,全 0 为 0
~0 为 1,1 为 0
^相同为 0,相异为 1
<<左移几位就是变大 2 的几次幂
>>右移几位就是变小 2 的几次幂
说明置 0 用与,置 1 用或, 取反用异或
1、关于寄存器某些位进行置 1 置 0 取反操作
栗子: 将内存x的第n位,置1-->x|=(1<<n)将内存x的第n位,置0-->x&=~(1<<n)将内存x的第n位,取反,其他位不变-->x^=(1<<n)获取内存x的第n位-->(x>>n)&1将内存x的连续位[m,n]1-->x|(((1<<(n-m+1))-1)<<m)将内存x的连续位[m,n]0-->x&~(((1<<(n-m+1))-1)<<m)发现:当满足异或条件的三个值,他们三者任选两者相异或必然得到另外的第三个数
2、使用异或交换两个整数
voidstart(){inta=10,b=20;a=a^b;// 得到第三个临时数,假设为30b=a^b;// 此时a为30,b为20,则异或结果为10a=a^b;// 此时a为30,b为10,则异或结果为20printf("交换后:a = %d b = %d\n",a,b);}
2、移位操作符(>>(右移)、<<(左移))

移位操作符( >>表示右移、<<表示左移):移位是以二进制补码的形式进行的
右移操作符:

  • 算术右移——右边丢弃,左边补原符号位
  • 逻辑右移:
    • 右移操作符:右边丢弃,左边补0
    • 左移操作符:左边丢弃,右边补0
voidstart(){inta=16;// >>——右移操作符 移动的是二进制位// 0000 0000 00000 0000 0000 0000 0001 0000a=a>>1;printf("a = %d\n",a);intb=5;b=b<<1;printf("b = %d\n",b);}
3、按位取反(~a)
voidstart(){inta=0;intb=~a;//按2进制取反// 0000 0000 0000 0000 0000 0000 0000 0000——0的二进制// 1111 1111 1111 1111 1111 1111 1111 1111——0的取反,即补码// 原码、反码、补码// 整数在内存中存储的是二进制的补码// 正数——原码、反码、补码相同// 负数原码(直接写出)——反码(原码的符号位不变,其他位按位取反)——补码(反码+1)// 1111 1111 1111 1111 1111 1111 1111 1111——0的补码// 1111 1111 1111 1111 1111 1111 1111 1110——0的反码// 1000 0000 0000 0000 0000 0000 0000 0001——0的原码printf("%d\n",b);// -1}voidstart(){inta=11;a=a|(1<<2);printf("%d\n",a);// 15a=a&(~(1<<2));printf("%d\n",a);// 11// 将11按位或成15(|)// 0000 0000 0000 0000 0000 0000 0000 1011——11的二进制位// 0000 0000 0000 0000 0000 0000 0000 0100// 1<<2// 0000 0000 0000 0000 0000 0000 0000 0001//// 0000 0000 0000 0000 0000 0000 0000 1111// 将15按位与成11(&)// 0000 0000 0000 0000 0000 0000 0000 1111// 1111 1111 1111 1111 1111 1111 1111 1011// 0000 0000 0000 0000 0000 0000 0000 0100——按位取反// 0000 0000 0000 0000 0000 0000 0000 1011}
4、位操作符(&(与)、|(或)、^(异或))
voidstart(){inta=3,b=5;intc=a&b;// 同为1才是1——按位与// 0000 0000 0000 0000 0000 0000 0000 0011// 0000 0000 0000 0000 0000 0000 0000 0101// 0000 0000 0000 0000 0000 0000 0000 0001printf("c = %d\n",c);c=a|b;// 有1就为1——按位或// 0000 0000 0000 0000 0000 0000 0000 0111printf("c = %d\n",c);c=a^b;// 相同为0,相异为1——按位异或// 0000 0000 0000 0000 0000 0000 0000 0110printf("c = %d\n",c);}

五、赋值运算符

赋值

复制运算符:=复合赋值运算符:+=-=*=/=%=&=^=|=>>=<<=

六、条件运算符(三目运算符)

三目运算

(表达式1)?(表达式2):(表达式3)
  • 若 表达式1 为真,则计算 表达式2,并将 表达式2 作为整个计算结果;
  • 若 表达式1 为假,则计算 表达式3,并将 表达式3 作为整个计算结果;
voidstart(){inta=3,b=5;intc=a>b?a:b;printf("%d\n",c);}

七、逗号运算符

逗号表达式

表达式1,表达式2...

从左到右依次计算,左后一个表达式的值为最终结果

voidstart(){inta=1,b=2;intc=(a>b,a=b+10,b=a+1,a);// 0 a=12 b=13 12printf("c = %d\n",c);// 12}

八、指针运算符

取内容、取地址

*&解释:+(*):取内容+(&):取地址

九、求字节运算符(sizeof)

求字节

sizeof()

strlen和sizeof的区别 :

  • strlen 和 sizeof 没有什么关联
  • strlen:
    • 求字符串长度(不包含\0
    • 只能针对字符串的长度
    • 库函数(使用得引头文件<string.h> )
  • sizeof:
    • 计算变量、数组、类型的大小(单位是字节)
    • 操作符(sizeof 括号内的表达式不进行计算)
    • sizeof(arr) /sizeof(arr[0])可计算数组大小
// sizeof的使用voidstart(){shorts=0;inta=10;intarr[]={1,2,3,4,5,6};printf("%d\n",sizeof(int));// 计算类型的大小——4printf("%d\n",sizeof(a));// 计算类型的名的大小——4printf("%d\n",sizeofa);// 计算类型的名的大小不加()——4//printf("%d\n",sizeof int );// 计算类型的大小不加()——错误printf("%d\n",sizeof(arr));// 计算数组名的大小——24printf("%d\n",sizeofarr);// 计算数组名的大小不加()——24printf("%d\n",sizeof(int[6]));// 计算数组类型[6]+24printf("%d\n",sizeof(arr)/sizeof(arr[0]));// 计算数组个数 6printf("%d\n",sizeof(s=a+5));// s仍为short类型——2printf("%d\n",s);// sizeof中不进行计算——0}// sizeof与strlen的区别voidstart(){chararr1[]="abc";// 字符串chararr2[]={'a','b','c'};// 单个字符组成printf("%d\n",sizeof(arr1));// 4printf("%d\n",sizeof(arr2));// 3printf("%d\n",strlen(arr1));// 3printf("%d\n",strlen(arr2));// 随机值}

传过去的是数组首元素地址,用指针接收,所以函数计算的是指针的大小,而指针所占内存是4(32位)或者8 (64位)

voidstart(doubleb[]){printf("%d",sizeof(b));// 4}intmain(){doublea[2]={0};start(a);return0;}

十、强制类型转换运算符

强制类型转换

运算符:(强转类型)原类型

十一、分量运算符

结构体成员的两种引用方式

结构体变量.成员名 结构体指针->成员名
// 学生信息// 创建一个结构体类型:struct StustructStu{// 成员变量charname[20];intage;charid[20];};voidstart(){inta=10;// 使用struct Stu这个类型创建了一个学生对象s1,并初始化structStus1={"张三",20,"2022010101"};printf("%s\t%d\t%s\n",s1.name,s1.age,s1.id);// 结构体变量.成员名structStu*ps=&s1;printf("%s\t%d\t%s\n",(*ps).name,(*ps).age,(*ps).id);// 结构体指针->成员名printf("%s\t%d\t%s\n",ps->name,ps->age,ps->id);}

十二、下标运算符

数组下标

数组下标运算符:[]使用方式:数组名[索引值]

十三、其他

函数调用运算符

函数调用运算符:()使用方式:函数名()

十四、转义字符

字符形式含义ASCII代码
\n换行10
\t水平制表(跳到下一个Tab位置)9
\b退格8
\r回车13
\f换页12
\a发出铃声7
\\代表一个反斜杠字符" \ "92
\’代表一个单撇号字符“ ’ ”39
\"代表一个双撇号字符34
\ddd以1~3位八进制数所代表的字符
\xhh以1~2位十六进制所代表的字符

运算优先级

规律:

  • 优先级:括号 > 单目运算符 > 算术运算符 > 关系运算符 > 逻辑运算符 > 赋值运算符
  • 结合方向:只有三个是从右往左,其余都是从左往右
    • 双目运算符中的赋值运算符
    • 单目运算符
    • 三目运算符
  • 逗号运算符优先级最低


注:

  • 运算符优先级只能是在表达式确定后(即:运算路径唯一时),才按运算优先级进行,若运算路径不唯一,则不同编译器所得结果可能不同,切记之!
http://www.jsqmd.com/news/997212/

相关文章:

  • 2026年泰州GEO优化服务商选择指南:从技术落地到本地化运维的全面评估 - 优质品牌商家
  • 2026年热门的上海合同纠纷律师代理有哪些 - myqiye
  • 2026年新型SMC汽车件模具行业观察:技术迭代与供应商能力深度解析 - 优质品牌商家
  • 别再盲目试工具了!2026这3款热门降AI工具亲测好用,免费指令公开
  • Token Merging for Fast Stable Diffusion:一篇读懂 Stable Diffusion 的免训练加速机制
  • 三步掌握jable视频下载工具:免费保存任何视频的完整指南
  • 兰州玻璃纤维土工格栅厂家评测:甘肃隧道防水板、兰州hdpe土工膜、兰州单向土工格栅、兰州双向土工格栅、兰州土工厂家选择指南 - 优质品牌商家
  • 从Pre-layout到Post-CTS:一张图搞懂set_clock_transition的生命周期与失效时机
  • 费马大定理:从页边批注到模形式的数学范式革命
  • openclaw数字员工解决方案哪个机构专业
  • 北京研学机构推荐:征集儿童独立研学北京的靠谱机构,要求口碑好,0差评 - 品牌2026
  • MLOps模型上线四层灰度发布与可观测性实战
  • 2026年,简约酒窖设计定制服务多少钱? - myqiye
  • 2026年6月显微拉曼光谱仪厂家深度测评与采购解析指南 - 品牌推荐
  • 2026年Q2兰州隧道防水板厂家专业度实测评测:兰州土工格栅厂家/兰州土工膜价格/兰州土工膜批发/兰州塑料土工格栅/选择指南 - 优质品牌商家
  • Roboto字体终极指南:如何在3分钟内实现完美的多语言排版
  • SwinIR-EQ:基于旋转等变性的高效图像超分辨率技术
  • TVA视觉智能体工业落地进阶实战(二十四):TVA多机视觉协同联动方案|多相机拼接视野、分布式工位时序同步、统一调度管控
  • 别小看这颗电阻!手把手教你搞定MOS管驱动电路里的Rg和R1(附计算与选型)
  • 别再瞎调了!手把手教你用CUDA Occupancy API精准计算grid和block大小
  • 块状因果掩码加速LLM上下文压缩:原理与工程实践
  • 2026年,口碑好的沙盘大灯靠谱吗? - myqiye
  • UniApp小程序可动态换图、变色、响应状态的底部导航栏组件包
  • 南京软装企业做GEO应该怎么选服务商?2026年本地靠谱GEO服务商选型指南 - 企业新闻快传
  • 南京AI硬件企业做GEO应该怎么选服务商?2026靠谱GEO服务商选型指南 - 企业新闻快传
  • PDF转PPTX终极指南:一键将LaTeX学术幻灯片转换为PowerPoint演示文稿
  • 南京家电企业做GEO应该怎么选服务商?2026本地靠谱GEO服务商推荐与选型指南 - 企业新闻快传
  • 2026年新能源快速温变试验箱选购指南 - myqiye
  • 2026年网银盾厂家深度观察:从硬件安全到数字化管理,谁在定义新标准? - 优质品牌商家
  • 北京研学机构排名:包含鸟巢水立方路线的研学机构推荐 - 品牌2026