源丰建设有限公司网站/国内seo服务商
2.4 C语言之运算符
- 一、算术运算符
- 二、关系运算符
- 三、逻辑运算符
- 四、自增自减运算符
- 五、按位运算符
- 六、赋值运算符
- 七、条件表达式
- 八、运算符优先级与求值次序
一、算术运算符
二元算术运算符包括:+
(加)、-
(减)、*
(乘)、/
(除)、%
(取模)
- 整数除法会截断结果中的小数部分
- 表达式x
%
y的结果是x除以y的余数,当x能被y整除时,其值为0。 - 取模运算符不能应用于float和double类型。
- 在有负操作数的情况下,整数除法截取的方向以及取模运算结果的符号取决于具体机器的实现,这和处理上溢和下溢的情况是一样的
- 二元运算符
+
和-
具有相同的优先级,它们的优先级比*
、/
和%
的优先级低 - 而二元运算符
*
、/
和%
的优先级低于一元运算符+
和-
- 算术运算符采用从左到右的结合规律
二、关系运算符
关系运算符包括:>
、 >=
、 <
、<=
- 关系运算符优先级相同
- 关系运算符优先级低于算术优先级,因此 i
<
lim - 1 等价于 i<
(lim - 1) - 关系运算符优先级高于相等性运算符(
==
、!=
),因此0!=
a<=
1 等价于 0!=
(a<=
1)
三、逻辑运算符
逻辑运算符包括:&&
(与) 、||
(或) 、!
(非)
- 由
&&
或||
连接的表达式按从左到右的顺序进行求值,并且,在知道结果值为真或假后立即停止计算(短路)。 &&
优先级高于||
,但是两者都比关系运算符和相等性运算符的优先级低- 在关系表达式或逻辑表达式中,如果关系为真,则表达式的结果值为数值1,如果为假,则结果值为数值0
- 逻辑运算符!的作用是将非0操作数转换为0,将操作数0转换为1。一般这样用 if(!valid),一般不采用 if(valid==0)
四、自增自减运算符
C语言提供了两个用于变量递增与递减的特殊运算符。自增运算符++
使其操作数递增1,自减运算符--
使其操作数递减1。
++
与--
这两个运算符特殊的地方在于:它们既可以用作前缀运算符(++n),也可以用作后缀运算符(n++)。在这两种情况下,其效果都是将变量n的值加1。但是,它们之间有一点不同。表达式++n先将n的值递增1,然后再使用变量n的值;而表达式n++则是先使用n的值,然后再将n的值递增1。- 如果n的值为5,那么 x = n++; 执行后的结果是将x置为5,而 x = ++n; 执行后的结果是将x置为6,这两条语句执行完成后,变量n的值都是6。
- 自增自减运算符只能作用于变量,类似于表达式(i+j)++是非法的
五、按位运算符
C语言提供了6个位操作运算符。这些运算符只能作用于整型操作数,即只能作用于带符号或无符号char、short、int、long类型:
运算符 | 说明 | 运算规则 |
---|---|---|
& | 按位与(AND) | 参与运算的两个二进位都为1,结果位才为1;1&1=1, 1&0=0,0&1=0,0&0=0 |
| | 按位或(OR) | 参与运算的两个二进位只要有一个为1,结果位就为1;1|1=1, 1|0=1, 0|1=1, 0|0=0 |
^ | 按位异或(XOR) | 参与运算的两个二进位不同,结果位为1,相同,结果位为0;1^1=0, 1^0=1, 0^1=1, 0^0=0 |
<< | 左移 | m<<n,将二进制位左移n位 |
>> | 右移 | m>>n, 将二进制位右移n位 |
~ | 按位求反(一元运算符) | 0变1,1变0 |
- 按位与运算符
&
经常用于屏蔽某些二进制位(x&1=x; x&0=0,其中x取值0或者1),比如:
n = n & 0177; 该语句将n中除7个低二进制位外的其它各位均置为0
0177八进制–>十进制127–>二进制 01111111
可以看出,0177对应的二进制的7个低位都是1,那么不管n的7个低位是1还是0,与0177进行&运算之后这7位的结果总是保持不变;而除了这7个低位,n的其它位都将&0,其结果显然也是0 - 按位或运算符
|
经常用于将某些二进制位置为1(x|
1=1; x&0=x,其中x取值0或者1),比如:
n = n|
SET_ON; 该语句将n中对应于SET_ON中为1的那些二进制位置为1。 - 按位异或运算符^当两个操作数的对应位不相同时,将该位设置为1,否则,将该位设置为0
- 注意区分按位运算符
&
、|
与逻辑运算符&&
、||
,比如:
int x = 1, y = 2;
printf(“%d”, x & y); // 0
printf(“%d”, x && y); // 1 - 移位运算符<<和>>分别用于将运算的左操作数左移和右移,移动的位数则由右操作数指定(右操作数的值必须是非负值)。表达式x<<2表示将x的值左移两位,右边空出的两位用0填补,该表达式等价于对左操作数乘以4;在对unsigned类型的值右移时,左边空出的部分用0填补;在对signed类型的值右移时,某些机器将对左边空出部分用符号位填补(即算术移位),而另一些机器则对左边空出部分用0填补(即逻辑移位)
#include <stdio.h>main()
{int x = 5; // 0000 0101 printf("%d\n", x << 2); // 0001 0100 20=x*4printf("%d\n", x >> 2); // 0000 0001 1=x/4unsigned int y = 5; // 0000 0101 printf("%d\n", y >> 2); // 0000 0001 1=x/4signed int z = -5; // 1000 0101原码 --> 1111 1010 反码(原码取反) --> 1111 1011 补码(反码加1)printf("%d\n", z >> 2); // 1111 1011(-5补码) -->右移2位,左边空位补符号位 1111 1110补码 --> 1111 1101反码 --> 1000 0010原码 -2return 0;
}
关于负数的二进制可以参考我的另一篇博客:负数的二进制
- 一元运算符~用于求整数的二进制反码,即1变0,0变1,比如:
int a = 64 + 16 + 1;// 077八进制-->十进制63-->二进制 011 1111 -->取反 0100 0000// 0101 0001 a//&0100 0000 ~077//=0100 0000a = a & ~077; // 将把a的最后六位设置为0printf("%d\n", a);
- 看一个例子
printf("%d\n", ~0); // -1 1000 0001 -> 1111 1111(补)printf("%d\n", ~0 << 2); // 1111 1111(补) << 2 --> 1111 1100(补) 1111 1011(反) 1000 0100(原) -4printf("%d\n", ~(~0 << 2)); // 1111 1100 -->取反 0000 0011printf("%d\n", getbits(13, 2, 2));// 返回整数x从第p位(从右边数,假定最右边是第0位)开始,往右数n位的值,也即除了这n位,其左边位都置0
unsigned getbits(unsigned int x, int p, int n) {// 0000 1101 x=13 p=2 n=2// 0000 0110 //&0000 0011 // 0000 0010 2return (x >> (p + 1 - n)) & ~(~0 << n);
}
x >> (p + 1 - n) 将要求的n位数移到最右端,其中p+1-n就是要求的n位数的右端的没用的位数;
~0所有位都为1;
~0<<n左移n位,右端的n位置0;
~(~0<<n)右端的n位置1;
做&运算,将n位左边位都置0
六、赋值运算符
在赋值表达式中,如果表达式左边的变量重复出现在表达式的右边,如:
i = i + 2,
则可以将这种表达式缩写为下列形式:
i += 2,其中的+=属于赋值运算符
大多数二元运算符都有相应的赋值运算符op=,其中op可以是下面这些运算符之一:
+
-
*
/
&
<<
>>
&
^
|
七、条件表达式
下面这组语句:
if (a > b)z = a;elsez = b;
用于求a和b中的最大值,并将结果保存到z中。条件表达式(使用三元运算符" ? : ")提供了另外一种方法编写这段程序及类似的代码段。在表达式
expr1 ? expr2 : expr3
中,首先计算expr1,如果其值不等于0(为真),则计算expr2的值,并以该值作为条件表达式的值,否则计算expr3的值,并以该值作为条件表达式的值。expr2和expr3中只能有一个表达式被计算。因此,以上语句可以改写为:
z = (a>b) ? a : b; /* z = max(a,b) */
八、运算符优先级与求值次序
下表总结了所有运算符的优先级与结合性,同一行中的各运算符具有相同的优先级,各行间从上往下优先级逐行降低。
运算符 | 结合性 |
---|---|
() [ ] -> . | 从左至右 |
! ~ ++ – + - * (type) sizeof | 从右至左 |
* / % | 从左至右 |
+ - | 从左至右 |
<< >> | 从左至右 |
< <= > >= | 从左至右 |
== != | 从左至右 |
& | 从左至右 |
^ | 从左至右 |
| | 从左至右 |
&& | 从左至右 |
|| | 从左至右 |
? : | 从左至右 |
= += -= *= /= %= &= ^= |= <<= >>= | 从右至左 |
, | 从左至右 |
- 运算符-> .用于访问结构成员,sizeof 对象长度,后续讨论
- 一元运算符*(通过指针间接访问),一元运算符&(对象地址),后续讨论
- 注意:一元运算符+、-、*、&优先级高于二元运算符+、-、*、&
- C语言没有指定同一运算符中多个操作数的计算顺序(&& || ?: ,运算符除外)。例如:
x = f() + g();
在上面的语句中,f()可以在g()之后计算,也可以在g()之前计算。因此,如果f或g改变了另一个函数所使用的变量,那么x的结果可能会依赖这两个函数的计算顺序。解决办法是把中间结果保存在临时变量中。 - 类似地,C语言也没有指定函数各参数的求值顺序。例如:
printf(“%d %d\n”, ++n, power(2, n)); 在不同的编译器中的输出结果可能不同,这取决于先执行n的自增还是先执行power函数,解决的办法是
++n;
printf(“%d %d\n”, n, power(2, n)); - 函数调用、嵌套赋值语句、自增、自减都可能产生副作用(在对表达式求值的同时,修改了某些变量的值)。在有副作用影响的表达式中,其执行结果同表达式中的变量被修改的顺序之间存在着微妙的依赖关系,比如:
a[i] = i++;
数组下标i是引用旧值还是新值?编译器不同,结果可能不同。C语言标准对大多数这类问题有意未作具体规定。表达式何时会产生这种副作用(对变量赋值),将由编译器决定,因为最佳的求值顺序同机器结构有很大关系。(ANSI C标准明确规定了所有对参数的副作用都必须在函数调用之前生效,但这对前面介绍的那种printf函数调用没有什么帮助) - 在任何一种编程语言中,如果代码的执行结果与求值顺序有关,则都是不好的程序设计风格。如果不知道这些问题在各种机器上是如何解决的,就不要尝试使用某种特殊的实现方式。
相关文章:

2.4 C语言之运算符
2.4 C语言之运算符 一、算术运算符二、关系运算符三、逻辑运算符四、自增自减运算符五、按位运算符六、赋值运算符七、条件表达式八、运算符优先级与求值次序 一、算术运算符 二元算术运算符包括:(加)、-(减)、*(乘)、/(除)、%(取模) 整数除法会截断结果中的小数部…...

做题笔记:SQL Sever 方式做牛客SQL的题目--SQL157
----SQL157 平均播放进度大于60%的视频类别 计算各类视频的平均播放进度,将进度大于60%的类别输出。 注: 播放进度播放时长视频时长*100%,当播放时长大于视频时长时,播放进度均记为100%。 结果保留两位小数,并按播放进…...

微信小程序map视野发生改变时切换定位点
<!--地图--> <view><map id"myMap" style"width: 100%; height: 300px;" latitude"{{latitude}}" longitude"{{longitude}}"scale"{{scale}}" markers"{{markers}}" controls"{{controls}}&q…...

javaweb搭配ajax和json
ajax一般用来前端界面与后端界面交互使用。数据格式一般使用json,优点是便于对象与字符串的转化。 1.不适用json对象封装。 jsp: <script>$.ajax({url: "/LoginServlet",data: {"name":name, "pwd":password},dataType: &qu…...

VS2022 将项目打包,导出为exe运行
我有一个在 VS2022 上开发的程序,基于.net 6框架, 想打包成 .exe程序,以在另一个没有安装VS的机器上运行,另一个机器是Win7系统,上面安装了.net 6框架。 虽然网上很多教程,需要安装Project Installer,配置A…...

【Py/Java/C++三种语言OD2023C卷真题】20天拿下华为OD笔试【DP】2023C-分班【欧弟算法】全网注释最详细分类最全的华为OD真题题解
文章目录 题目描述与示例题目描述输入描述输出描述示例一输入输出 示例二输入输出 解题思路代码PythonJavaC时空复杂度 华为OD算法/大厂面试高频题算法练习冲刺训练 题目描述与示例 题目描述 幼儿园两个班的小朋友在排队时混在了一起,每位小朋友都知道自己是否与前…...

pr模板哪个网站好?免费Pr模板视频素材下载网站 Prmuban.com
pr模板哪个网站好?哪里可以下载免费的pr模板视频素材,PR模板网(Prmuban.com)影视后期制作模板视频剪辑素材资源网站。 包含PR模板、PR插件、PR预设、MOGRT、LUT、转场特效、音乐素材、音效素材等,更好的剪辑师必备资源…...

【论文阅读】LoRA: Low-Rank Adaptation of Large Language Models
code:GitHub - microsoft/LoRA: Code for loralib, an implementation of "LoRA: Low-Rank Adaptation of Large Language Models" 做法: 把预训练LLMs里面的参数权重给冻结;向transformer架构中的每一层,注入可训练的…...

MybatisPlus的分页插件
PaginationInnerInterceptor 此插件是核心插件,目前代理了 Executor#query 和 Executor#update 和 StatementHandler#prepare 方法。 在SpringBoot环境中配置方式如下: /*** author giserDev* description 配置分页插件、方言、mapper包扫描等* date 2023-12-13 …...

保障网络安全:了解威胁检测和风险评分的重要性
在当今数字时代,网络安全问题变得愈发突出,而及时发现和迅速应对潜在威胁成为保障组织信息安全的首要任务。令人震惊的是,根据2023年的数据,平均而言,检测到一次网络入侵的时间竟然长达207天。这引起了对安全策略和技术…...

3D摄影棚布光:Set A Light 3D Studio
Set A Light 3D Studio是一款专业的灯光模拟软件,旨在帮助摄影师和电影制片人在电脑上进行虚拟灯光布置和场景模拟,以实现更加精准和高质量的拍摄效果。该软件提供了丰富的灯光和场景模型,支持灵活调整光源位置、强度、颜色和效果等参数&…...

#HarmonyOS:应用的包名配置--应用图标和标签配置--配置链接
配置相关 https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V2/application-component-configuration-stage-0000001478340869-V2 应用的包名配置 应用需要在工程的AppScope目录下的app.json5配置文件中配置bundleName标签,该标签用于标识应用的唯…...

docker小白第三天
docker小白第三天 docker为什么会比虚拟机快 1、docker有着比虚拟机更少的抽象层。不需要Hypervisor实现硬件资源虚拟化,运行在docker容器上的程序直接使用的都是实际物理机的硬件资源,因此在CPU、内存利用率上docker将会在效率上有明显优势。 2、dock…...

FFmpegd的AVBSF
本章主要介绍AVBSF 文章目录 结构体定义对外函数常见的过滤器 从名字我们可以知道这是个码流过滤器,我们最常用的是一个叫做h264_mp4toannexb_bsf的东东 这个过滤器的作用是把h264以MP4格式的NALU转换为annexb(0x000001) const AVBitStreamF…...

深圳三男子写字楼内吸烟被罚,快用富维AI神器,实时监控防火灾
最近,在深圳,一专项控烟督查组在福田区新华保险大厦发现三名男子在写字楼内楼道违法吸烟,并对其进行了现场处罚。根据《控烟条例》,这类室内区域严禁吸烟,但人们往往忽视这一规定,从而引发潜在的安全风险。…...

有哪些已经上线的vue商城项目?
前言 下面是一些商城的项目,需要练手的同学可以挑选一些来练,废话少说,让我们直接开始正题~~ 1、newbee-mall-vue3-app 是一个基于 Vue 3 和 TypeScript 的电商前端项目,它是 newbee-mall 项目的升级版。该项目包含了商品列表、…...

Nginx服务器配置SSL证书
本文将全面介绍如何在Nginx或Tengine服务器配置SSL证书,具体包括下载和上传证书文件,在Nginx上配置证书文件、证书链和证书密钥等参数,以及安装证书后结果的验证。成功配置SSL证书后,您将能够通过HTTPS加密通道安全访问Nginx服务器…...

【JVM从入门到实战】(六)类加载器的双亲委派机制
一、双亲委派机制 在Java中如何使用代码的方式去主动加载一个类呢? 方式1:使用Class.forName方法,使用当前类的类加载器去加载指定的类。 方式2:获取到类加载器,通过类加载器的loadClass方法指定某个类加载器加载。 …...

SpringCloud面试题及答案(最新50道大厂版,持续更新)
在Java开发中,Spring Cloud作为微服务架构的关键组成部分,为了帮助广大Java技术爱好者和专业开发人员深入理解Spring Cloud,本文《SpringCloud面试题及答案(最新50道大厂版,持续更新)》提供了最前沿、最实用…...

Next.js 的设计理念
Next.js 的设计理念:简洁、强大与高效 Next.js 是一个流行的 React 框架,由 Vercel 公司开发。它的设计理念是简洁、强大和高效,这种理念贯穿于 Next.js 的所有功能中。下面我们将深入探讨这三个设计理念。 简洁 Next.js 的一个核心设计理…...

26、文件包含
文章目录 一、文件包含1.1 概念1.2 PHP文件包含原理1.3 文件包含重要函数1.4 文件包含利用条件 二、文件包含漏洞利用2.1 文件包含分类2.2 常见敏感文件2.3 包含Apache日志文件2.4 常见中间件的日志路径2.5 包含其他日志文件2.5.1 SSH日志文件2.5.2 Session文件 三、PHP封装伪协…...

飞天使-linux操作的一些技巧与知识点4-ansible常用的技巧,配置等
文章目录 ansible配置文件的优先级尝试开始进行操作ansible常用模块ansible 的playbook示例安装phpplaybook中变量的引用 ansible yum install -y ansible 测试是否可用 ansible localhost -m ping /etc/ansible/ansible.cfg :主配置文件,配置 ansible…...

Stable Diffusion 源码解析(1)
参考1:https://blog.csdn.net/Eric_1993/article/details/129393890 参考2:https://zhuanlan.zhihu.com/p/613337342 1.StableDiffusion基本原理1.1 UNetModel、FrozenCLIP 模型1.2 DDPM、DDIM、PLMS算法 2. Runwayml SD 源码2.1 Img2Img Pipeline2.2 DD…...

java.lang.ClassNotFoundException:javax.xml.bind.DatatypeConverter 报错解决
问题原因: 这有可能是因为SpringBoot项目结合jwt进行用户登录时出现的问题,因为jdk版本太高导致的 解决办法: 方法一: 降低jdk版本 检查JDK版本,如果你是JDK17版本,就降到JDK8版本 方案二:在meven中添加依赖 注意: 如果2.3.1的版本不生效,则使用2.3.0的版本 <…...

Python学习笔记-类
1 定义类 类是函数的集合,class来定义类 pass并没有实际含义,只是为了代码能执行通过,不报错而已,相当于在代码种占一个位置,后续完善 类是对象的加工厂 2.创建对象 carCar()即是创建对象的过程 3、类的成员 3.1 实例…...

了解如何在linux使用podman管理容器
本章主要介绍使用 podman 管理容器。 了解什么是容器,容器和镜像的关系 安装和配置podman 拉取和删除镜像 给镜像打标签 导出和导入镜像 创建和删除镜像 数据卷的使用 管理容器的命令 使用普通用户管理容器 使用普通用户管理容器 对于初学者来说,不太容…...

SQL命令---修改字段的数据类型
介绍 使用sql语句修改字段的数据类型。 命令 alter table 表明 modify 字段名 数据类型;例子 有一张a表,表里有一个id字段,长度为11。使用命令将长度修改为12 下面使用命令进行修改: alter table a modify id int(12) NOT NULL;下面使修…...

一键提取微信聊天记录,生成HTML、Word文档永久保存,还能生成微信年度聊天报告
不知道生活中你有没有遇到过这种情况,聊天记录不完整,有的在手机上,有的在电脑上,搜索起来很烦。那有没有一种办法可以把微信聊天记录统一呢?当然是有的。下面,就让我们一起来看一下怎么操作。 先看效果 操…...

docker使用详解
介绍 Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的Linux或Windows操作系统的机器上,也可以实现虚拟化。 Docker基于轻量级虚拟化技术,整个项目基于Go语言开…...

MidJourney笔记(7)-Seeds
我相信很多人在使用MidJourney的时候,都会遇到一个问题,就是如何保持生成图像的一致性,或者相对一致性,差异性不是很大。此时,我们就需要引入一个seed值,类似给这个提示词生成的图片做一个id标识。 那这个seed值怎么使用? 其实,在我们每次生成的图片,都有有一个seed值…...