编程语言|C语言——C语言操作符的详细解释

这篇文章主要详细介绍了C语言的操作符,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

一、基础

1.1 算数操作符

+   -   *   /   %   +=   -=  *=  /=  这些操作符是我们编程时候最常用的几个算数操作符

+ - * 等算数操作符就不用再多说了,与正常的数学用法相同,下面是一些常用但是初学者可能不太容易把握、易错的算数操作符

1.1.1 / 操作符

/:除法,除法在C语言中分为整数除法浮点数除法

整数除法:/d的两个操作数都为整数,计算方法是向下取整

得到结果为2

浮点数除法:储存值的变量必须是浮点数, 两个操作数中至少有一个为浮点数,但除数或者被数不一定要用浮点数存储,只需要在计算时进行转化即可

%.nlf也可以使结果自动四舍五入保留n位小数

1.1.2 %取余操作符

取余运算符得到的是余数,但取余操作符的两个操作数都要为整数

 c的值就等于8除以3的余数 2

1.1.3 +=  -=  *=  /=操作符

直接举例子:

a+=2就等同于a=a+2,将a的值加2再赋值给a

a-=2就等同于a=a-2,将a的值减2再赋值给a

*=、/=也是相同的道理

1.2 单目操作符

单目操作符,顾名思义,单目,就是操作数只有一个的操作符

1.2.1 !  操作符

! 逻辑反操作,将真变为假,将假变为真

在逻辑定义中,0表示假,非0则表示真

在这段代码中,先给i赋初值0,然后在while判断是否进入循环时,!0就是真,进入循环,但为了防止死循环,我们加上一个限制条件,保证只打印5次

同样,如果while判断条件只有一个0时,则说明为假,不进入循环,打印0次

1.2.2 sizeof 操作符

sizeof(类型名);sizeof()返回无符号的所计算的对象或者类型所占空间的大小,单位是字节

sizeof经常也用来计算数组元素的个数

1.2.3 ~操作符

~:按位取反操作符,对二进制位进行按位取反,将二进制补码每一位的0变1,1变0。注意,是对补码进行操作,负数要先将原码变为补码,同时取反得到的也是补码,看结果还得再变为原码

从图中可以看出,0在按位取反后应该是  -1,同样,在编译器上验证

1.2.4 ++、--操作符

前置++,前置--:先将变量+1或者-1,再作为表达式的值使用(先++,再使用)

后置++,后置--:先将变量的值作为表达式使用,再将变量+1或者-1(先使用,再++)

用上面的口诀想起来就容易多了

1.2.5 &  取地址操作符

&:取出某个变量、数组、函数等的地址,在比价复杂的代码中,我们经常用指针进行操作,&操作符就可以取出地址赋值给指针变量

1.2.6 *  间接访问操作符 

间接访问操作符,也称解引用操作符,操作数地址或指针,可以通过对地址的解引用,找到地址中存储的变量,对变量进行间接操作

1.2.7 ()强制类型转化

():将一种数据类型的变量强制转化为另一种数据类型

如参数需要一个无符号的整形变量,而你目前所有的是一个整形变量啊,就可以通过强制类型转化转化为组符号的整形,这个经常用于函数参数的优化部分

如:(unsigned int)a   即可将a转化为无符号的整形,同样,强制类型转化尽量要遵守由低到高转化,否则,也会丢失精度

1.3 逻辑操作符

&& 逻辑与 操作符:“同时都要满足”

||    逻辑或 操作符:“满足其中一个即可”

1&&2---->1       0&&1----->0   

1||2   ---->1       0||1----->1

1表示真,0表示假

例:找出1000---2000之间的闰年

闰年:如果year能够被4整除,并且不能被100整除,则year是闰年。或者如果year能够被400整除,则year是闰年,判断闰年就恰好用到了这两个操作符

int year = 0;for (year = 1000; year < 2000; year++){if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)//判断闰年printf("%d ", year);}

逻辑操作符这里有一个超级易错点

对于&&来说,如果表达式左边为0,则说明在逻辑上已经为了,那么右边全部的表达就不再进行计算,也不执行。

int i = 0,a=0,b=2,c =3,d=4;i = a++ && ++b && d++;printf("a = %d\n b = %d\n c = %d\nd = %d\n", a, b, c, d);

a++;---->是先将a的值使用,在对a加1。刚使用的表达式a的值为0,并且在&&的左边,所以后面++b,d++不再计算。

同样,对于||来说,如果表达式左边为非0则说明在逻辑上已经为了,那么右边全部的表达就不再进行计算,也不执行。

int i = 0, a = 0, b = 2, c = 3, d = 4;i = a++||++b||d++;printf("a = %d\n b = %d\n c = %d\nd = %d\n", a, b, c, d);

a++这个表达式的值为0,继续执行,但是++b的值为3,在||操作符的左边,并且在逻辑上已经为真了,所以后面的d++不再计算 

1.4 条件操作符

条件操作符是C语言中唯一一个三目操作符

表达式1如果为真,即计算表达式2,同时表达式2的结果就是三目操作符的运算结果

表达式2如果为假,即计算表达式3,同时表达式3的结果就是三木操作符的运算结果

也可以在编译器里面运行来验证

int a = 0, b= 3, max1 = 0,max2;if (b > a)max1 = b;elsemax1 = a;//等同于max2 = (b > a) ? b : a;printf("%d %d", max1, max2);

运算结果当然是max1=3  max2=3

1.5 逗号表达式

逗号表达式,就是用逗号隔开的多个表达式。里面的表达式从左向右依次执行,整个表达式的结果是最后一个表达式的结果。

int a = 1;
int b = 2;
int c = (a>b, a=b+10, a, b=a+1)

从左向右一次算a=b+10=12 ; b=a+1=13;然后将这个逗号表达式整体的值(即b=a+1)赋给变量c

即 c=13; 

需要注意的是逗号表达式的每一个表达式都必须从左向右依次计算

1.6 下标引用,函数调用和结构体成员访问

1.6.1 下标引用操作符[]

arr[2]=2;//将2赋值给arr[2]

[ ]就是下标引用操作符,arr和2是[ ]的两个操作数,arr为数组名,2为索引值

1.6.2 函数调用操作符() 

()可以接受一个或者多个操作数:第一个操作数是函数名,剩余的操作数就是传递给函数的参数,函数传参可以传多个参数

1.6.3 结构体访问操作符.->

用法:

结构体变量.结构体成员

结构体指针变量->结构体成员

#include <stdio.h>
struct Stu
{char name[10];int age;char sex[5];double score;
};
void set_age1(struct Stu stu)
{stu.age = 18;//结构体变量访问结构体成员
}
void set_age2(struct Stu* pStu)
{pStu->age = 18;//结构体指针变量访问结构体成员
}
int main()
{struct Stu stu;struct Stu* pStu = &stu; stu.age = 20;//结构成员访问set_age1(stu);pStu->age = 20;//结构成员访问set_age2(pStu);return 0;
}

1.7 关系操作符 

>

>=

<

<=

== 用于测试“相等”

!=  用于测试“不相等”

二、进阶

2.1 二进制

2.1.1 二进制的计算

2.1.2 二进制的存储

2.2 移位操作符

移位操作符移动的是二进制的补码,且操作数只能为整数

<< 左移操作符:将二进制位整体向左移动,左边丢弃,右边补零

图为将-15左移1位

>> 右移操作符:将二进制位整体向右移动,右边丢弃,左边补符号位

图为将-15右移一位

负数学会了,整数就更简单了,因为整数的原码,反码,补码都一样,不用互相转化

2.3 位操作符

位操作符的操作数必须为整数 

& 按位与: a&b 对应的二进制补码 :有0则为0,同时为1才为1

| 按位或a|b 对应的二进制补码 :有1则为1,同时为0才为0

^ 按位异或:  a^b 对应的二进制补码 :相同为0,不同为1

实例1:不创建第三个变量,实现两个整数的交换

方法1:

    int a = 2;int b = 3;printf("交换前:a = %d, b= %d\n", a, b);a = a + b;b = a - b;a = a - b;printf("交换后:a = %d, b= %d", a, b);

这种方法在一般情况下可以,但是当a,b非常大时,a+b可能会超过存储范围(长度大于整形) 

方法2:用按位异或计算

int main()
{int a = 2;int b = 3;printf("交换前:a = %d, b= %d\n", a, b);a = a ^ b;b = a ^ b;a = a ^ b;printf("交换后:a = %d, b= %d", a, b);return 0;
}

在解释原因前,先演示一下按位异或的几个规则

a^a=0 详细看图

a^0=a 详细看图

a^b^a=a^a^b,即按位异或运算满足交换律 详细看图

解释一下原因:a=a^b,然后 b=  (a^b)  ^b =a^0=a,即实现了将a的值赋给了b

同样:a=a^b,然后a=(a^b)^a=a^a^b=0^b=b,即实现了将b的值赋给了a

实例2:求一个整数存储在内存中的二进制中1的个数

一个数&1可以得到它的最低位(详细参考按位与操作符图解),如果a&1==1,说明a的最低位是1如果a&1==0,说明a的最低位是0,那么思路就清晰了,只需要将a的二进制位多次右移,每次右移后&1得到它的最低位,判断是否为1,为1的话,计数器就++,将32个二进制位尽皆遍历,即可知道共有多少个1

int main()
{int a = 31;//5个1int i = 0;int count = 0;for (i = 0; i < 32; i++){if (a & 1 == 1)	//说明a的最低位是1count++;a >>= 1;}printf("%d", count);
}

三、同一操作符的不同类型操作数之间的转化

例如:将整形3存到浮点型变量中,没问题。但是,将一个浮点型的数字存到一个整形变量中去,就可能会出现精度丢失问题。这些转化需要我们在写代码的时候自行完成

四、操作符的优先级

C语言操作符的优先级

在使用这张表时需仔细核对运算符的符号和名称,但在大多数情况下,我们选择直接将需要优先计算的用圆括号括起来,不过最基本的顺序还是得知道的,总不能一份代码到处都是圆括号吧。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/783031.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

QT初识(1)

QT初识 桌面开发什么是QT下载QT安装好之后的工具AssisantDesignerQT Creator 创建一个简单的项目 我们今天来认识一下QT。 桌面开发 在了解QT&#xff0c;我们得了解一下桌面开发&#xff1a; 桌面开发指的是编写和构建在个人计算机或其他桌面操作系统&#xff08;如Windows、…

关系网络c++

题目&#xff1a; 代码&#xff1a; #include<bits/stdc.h>using namespace std;int n,x,y;struct node{int num;//编号 int t;//步数 node(){}node(int sum,int tt){numsum;ttt;} }; int mp[101][101];//图 bool flag[101];//标记 queue<node> q; void bfs() {q…

【Docker】Windows中打包dockerfile镜像导入到Linux

【Docker】Windows中打包dockerfile镜像导入到Linux 大家好 我是寸铁&#x1f44a; 总结了一篇【Docker】Windows中打包dockerfile镜像导入到Linux✨ 喜欢的小伙伴可以点点关注 &#x1f49d; 前言 今天遇到一个新需求&#xff0c;如何将Windows中打包好的dockerfile镜像给迁移…

Autodesk Maya 2025---智能建模与动画创新,重塑创意工作流程

Autodesk Maya 2025是一款顶尖的三维动画软件&#xff0c;广泛应用于影视广告、角色动画、电影特技等领域。新版本在功能上进行了全面升级&#xff0c;新增了对Apple芯片的支持&#xff0c;建模、绑定和角色动画等方面的功能也更加出色。 在功能特色方面&#xff0c;Maya 2025…

equals()和hashcode()的区别【大白话Java面试题】

equals()和hashcode()的区别 大白话 1.equals()&#xff1a;反应的是对象或变量具体的值&#xff0c;及两个对象包含的具体的值&#xff08;可能是对象的引用&#xff0c;也可能是值类型的值&#xff09; 2.hashcode():计算两个对象的哈希值&#xff0c;并返回哈希码&#xff…

逆向分析之antibot

现在太卷了&#xff0c;没资源&#xff0c;很难接到好活&#xff0c;今天群里看到个单子&#xff0c;分析了下能做&#xff0c;结果忙活了一小会&#xff0c;幸好问了下&#xff0c;人家同时有多个人再做&#xff0c;直接就拒绝再继续了。就这次忘了收定金了&#xff0c;所以原…

使用python实现i茅台自动预约

使用python实现i茅台自动预约[仅限于学习,不可商用] 运行: 直接运行 imtApi.py 打包:切换到imt脚本目录,执行打包命令: pyinstaller --onefile imtApi.py这个应用程序可以帮助你进行茅台自动化配置。以下是一些使用说明: 平台注册账号(可用i茅台)不用登录,你可以进行…

Linux的VirtualBox中USB设备无法选择USB3.0怎么办?

在VirtualBox中&#xff0c;如果遇到USB设备无法选择 USB 3.0 的问题&#xff0c;可以尝试按照以下步骤来解决&#xff1a; 确保VirtualBox版本支持USB 3.0&#xff1a;首先&#xff0c;你需要确认你的VirtualBox版本是否支持USB 3.0。一些较旧的版本可能不支持&#xff0c;因此…

一篇搞定AVL树+旋转【附图详解旋转思想】

&#x1f389;个人名片&#xff1a; &#x1f43c;作者简介&#xff1a;一名乐于分享在学习道路上收获的大二在校生 &#x1f648;个人主页&#x1f389;&#xff1a;GOTXX &#x1f43c;个人WeChat&#xff1a;ILXOXVJE &#x1f43c;本文由GOTXX原创&#xff0c;首发CSDN&…

【Effective Web】页面优化

页面优化 页面渲染流程 JavaScript 》 Style 》 Layout 》 Paint 》 Composite 首先js做了一些逻辑&#xff0c;触发了样式变化&#xff0c;style计算好这些变化后&#xff0c;把影响的dom元素进行重新布局&#xff08;layout&#xff09;,再画到画布中&#xff08;Paint&am…

半导体工艺技术

完整内容点击&#xff1a;【半导体工艺技术】

将jupyter notebook文件导出为pdf(简单有效)

1.打开jupyter notebook笔记&#xff1a; 2.点击file->print Preview 3.在新打开的页面右键打印 4.另存为PDF 5.保存即可 6.pdf效果 &#xff08;可能有少部分图片显示不了&#xff09; 网上也有其他方法&#xff0c;比如将其转换为.tex再转为PDF等&#xff0c;但个人觉…

ubuntu 中安装docker

1 资源地址 进入ubuntu官网下载Ubuntu23.04的版本的镜像 2 安装ubuntu 这里选择再Vmware上安装Ubuntu23.04.6 创建一个虚拟机&#xff0c;下一步下一步 注意虚拟机配置网络桥接&#xff0c;CD/DVD选择本地的镜像地址 开启此虚拟机&#xff0c;下一步下一步等待镜像安装。 3…

数据可视化-ECharts Html项目实战(8)

在之前的文章中&#xff0c;我们学习了如何设置散点图涟漪效果与仪表盘动态指针效果。想了解的朋友可以查看这篇文章。同时&#xff0c;希望我的文章能帮助到你&#xff0c;如果觉得我的文章写的不错&#xff0c;请留下你宝贵的点赞&#xff0c;谢谢 今天的文章&#xff0c;会…

【c++】类和对象(六)深入了解隐式类型转换

&#x1f525;个人主页&#xff1a;Quitecoder &#x1f525;专栏&#xff1a;c笔记仓 朋友们大家好&#xff0c;本篇文章我们来到初始化列表&#xff0c;隐式类型转换以及explicit的内容 目录 1.初始化列表1.1构造函数体赋值1.2初始化列表1.2.1隐式类型转换与复制初始化 1.3e…

python基础——文件操作【文件编码、文件的打开与关闭操作、文件读写操作】

&#x1f4dd;前言&#xff1a; 这篇文章主要讲解一下python中对于文件的基础操作&#xff1a; 1&#xff0c;文件编码 2&#xff0c;文件的打开与关闭操作 3&#xff0c;文件读写操作 &#x1f3ac;个人简介&#xff1a;努力学习ing &#x1f4cb;个人专栏&#xff1a;C语言入…

04 | Swoole 源码分析之 epoll 多路复用模块

首发原文链接&#xff1a;Swoole 源码分析之 epoll 多路复用模块 大家好&#xff0c;我是码农先森。 引言 在传统的IO模型中&#xff0c;每个IO操作都需要创建一个单独的线程或进程来处理&#xff0c;这样的操作会导致系统资源的大量消耗和管理开销。 而IO多路复用技术通过…

OceanBase OBCA 数据库认证专员考证视频

培训概述 OceanBase 认证是 OceanBase 官方推出的唯一人才能力认证体系&#xff0c;代表了阿里巴巴及蚂蚁集团官方对考生关于 OceanBase 技术能力的认可&#xff0c;旨在帮助考生更好地学习 OceanBase 数据库产品&#xff0c;早日融入 OceanBase 技术生态体系&#xff0c;通过由…

MYSQL——索引概念索引结构

索引 索引是帮助数据库高效获取数据的排好序的数据结构。 有无索引时&#xff0c;查询的区别 主要区别在于查询速度和系统资源的消耗。 查询速度&#xff1a; 在没有索引的情况下&#xff0c;数据库需要对表中的所有记录进行扫描&#xff0c;以找到符合查询条件的记录&#…

Doris实践——票务平台的实时数仓建设

目录 前言 一、引入 Doris原因 二、基于Doris搭建数据平台 2.1 构建实时数仓 2.2 Flink CDC全库同步 三、基于Doris进行OLAP报表开发 四、未来规划 原文大佬介绍的这篇票务平台的实时数仓建设有借鉴意义&#xff0c;现摘抄下来用作沉淀学习。如有侵权&#xff0c;请告知…