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

C语言 恼人的结合性和优先级和副作用

结合性和优先级和副作用

  • 1.优先级
  • 2.结合性
  • 3.副作用
  • 4.简单区分i++,++i,i+=1;i=i+1;i=i++

1.优先级

优先级指的是,如果⼀个表达式包含多个运算符,哪个运算符应该优先执⾏。各种运算符的优先级是
不⼀样的。
在C语言中,优先性和结合性规则是非常重要的。然而C语言有几乎50中运算符,因此去费心记住不实际,当有疑问的时候我们要通过查表或者使用足够多的圆括号
在这里插入图片描述
当然我们应该记得一些常用的优先级,比如后缀自增自减符号优先级最高,前缀自增自减符号和一元正负符号次之,赋值符号优先级最低等等

2.结合性

如果两个或两个以上运算符优先级相同,优先级没办法确定先计算哪个了,这时候就看结合性了,则根据运算符
是左结合,还是右结合,决定执⾏顺序。⼤部分运算符是左结合(从左到右执⾏),少数运算符是右
结合(从右到左执⾏),⽐如赋值运算符( = )。
值得大家注意的是往往初学结合性的同学往往会将数学上的知识误入到C语言学习中,如(ab)+(cd)有些会认为加的时候从左向右加。结合性不是如此,此时表达式中只有一个运算符,因此这里并没有结合性
那么教大家一个非常简单区分结合性的方法如“a+b+c”,观察表达式有两个运算符优先级相同且都是左结合行的,我们就找到最右边的运算符将该运算符的左边括起来也就是“(a+b)+c”,右结合性同理
例子
a*-b/c-b
先找优先级,一元-的优先级最高
a*(-b)/c-b
其次乘除
(a*(-b)/c)-b
然后找结合性乘除都是左结合性的找到最后边的运算符/,将左边的括起来
((a*(-b))/c)-b
结束
尽管编译器能很轻松的识别出优先级和结合性,但是人不行。为了代码的可读性希望大写代码的时候适当加上圆括号

3.副作用

通常不希望运算符修改他们的操作数,因为数学中的运算符就是如此。但当我们使用赋值运算符包括简单赋值和复合赋值,还有自增自减运算符
在这里插入图片描述
连续的简单赋值可能会导致数据的丢失。(如果以上错误可以通过统一数据类型解决,那以下程序就是灾难了)
在这里插入图片描述
在面对C语言未定义的行为,我们是不是应该不在此引起歧义。我知道大家都是很优秀的程序员通过寥寥几行代码就可以完成复杂的程序,但往往可能代码过分的省略不见得是好事,因此我们将赋值语句拆开来写而不是一起放在一个表达式中

复合赋值介绍
在这里插入图片描述有些同学可能会将v+=e等价于v=v+e,首先是优先级的问题赋值运算符的优先级十分低,因此v/=j+k和v=v/j+k完成不同前者等于v=v/(j+k)
同时在极少数时候由于副作用
(i++)+=j和(i++)=(i++)+j后者进行了两次自增前面只进行了一次自增
下面例子
i=1;
j=i++ + i++;由优先级可得
j=(i++)+(i++)执行完该条语句之后i应该自增了两次,但是这两次自增是同时自增还是其中一个i先自行自增之后然后另一个再自增,两者的差别会导致j值得完全不同

  • 1.j=i+i;i++;i++;
  • 2.j=i(然后i自增了)+(i+1),后者i自增i++

4.简单区分i++,++i,i+=1;i=i+1;i=i++

在没有赋值的情况下,i++等同与++1。如果有赋值的情况下,i++先赋值再自增,++i先自增再赋值
i+=1与++i完全相同都是自增
i=i+1就是简单的操作数加法
i=i++涉及到自增和赋值运算,先赋值i=i,再自增,此时i会被覆盖

以上就是结合性和优先级的内容,希望大家平时写代码的时候多多注意,减少未定义的行为出现

相关文章:

C语言 恼人的结合性和优先级和副作用

结合性和优先级和副作用 1.优先级2.结合性3.副作用4.简单区分i,i,i1;ii1;ii 1.优先级 优先级指的是,如果⼀个表达式包含多个运算符,哪个运算符应该优先执⾏。各种运算符的优先级是 不⼀样的。 在C语言中&a…...

Vue——初识组件

文章目录 前言页面的构成何为组件编写组件组件嵌套注册 效果展示 前言 在官方文档中,对组件的知识点做了一个很全面的说明。本篇博客主要写一个自己的案例讲解。 vue 官方文档 组件基础 页面的构成 说到组件之前,先大致说明下vue中页面的构成要素。 在…...

MQ消息丢失/重复/顺序/挤压

rabbitmq消息丢失解决 rocketMq解决消息丢失 RocketMQ事务消息概要 RocketMQ事务消息是指应用本地事务和发送消息操作可以被定义到全局事务中,要么同时成功,要么同时失败。 采用了2PC(两阶段提交) 补偿机制(事务状态回…...

利用Quarkus构建高效微服务——Java的云原生革新

引言: 在微服务架构和容器技术日益成为企业开发标准的今天,Java开发者面临着如何将传统Java应用转型为高效、轻量级且易于扩展的云原生应用的挑战。Quarkus框架的出现,正是为了解决这一问题,它不仅能够提升Java在Kubernetes环境中…...

python 批量ts合并成一个mp4

首先,确保你已经安装了ffmpeg。 然后再次保证所有ts文件放在同一个文件夹中,并且依次命名为 1.ts 、 2.ts 、 3.ts 、 4.ts 、 4.ts 。。。 Python完整代码如下:(ffmpeg_batch_merge_ts.py文件) #!/usr/bin/python3 # -*- coding: UTF-8 -*…...

Java | Leetcode Java题解之第129题求根节点到叶节点数字之和

题目&#xff1a; 题解&#xff1a; class Solution {public int sumNumbers(TreeNode root) {if (root null) {return 0;}int sum 0;Queue<TreeNode> nodeQueue new LinkedList<TreeNode>();Queue<Integer> numQueue new LinkedList<Integer>();…...

SpringBoot【注解 01】@Scheduled实现定时任务的串行和并行执行

在SpringBoot中&#xff0c;如果使用Scheduled注解来定义多个定时任务&#xff0c;默认情况下这些任务将会被安排在一个单线程的调度器中执行。这意味着&#xff0c;这些任务将会串行执行&#xff0c;而不是并行执行。当一个任务正在执行时&#xff0c;其他被触发的任务将会等待…...

【工具】redis的安装使用

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、Redis简介二、Redis的安装使用三、本文总结 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 随着开发语言及人工智能工具的普及&am…...

汇编:数据定义数据填充

数组的定义 在32位汇编语言中&#xff0c;定义数组时&#xff0c;通常使用定义数据指令&#xff08;如 DB, DW, DD,DQ &#xff09;和标签来指定数组的名称和内容。DB定义字节数组&#xff08;每个元素占1字节&#xff09;、DW定义字数组&#xff08;每个元素占2字节&#xff…...

Python画图(多图展示在一个平面)

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…...

python-web应用程序-Django数据库-操作表中的数据

python-web应用程序-Django数据库-操作表中的数据 一、新增数据 类.objects.create(字段名 字段值&#xff0c;字段名 字段值&#xff0c;...)导入models包 models.User.objects.create(nameyulin,sex0,info三好学生)即可对数据进行操作 二、删除数据 类.objects.filter(…...

绕过WAF(Web应用程序防火墙)--介绍、主要功能、部署模式、分类及注入绕过方式等

网站WAF是一款集网站内容安全防护、网站资源保护及网站流量保护功能为一体的服务器工具。功能涵盖了网马/木马扫描、防SQL注入、防盗链、防CC攻击、网站流量实时监控、网站CPU监控、下载线程保护、IP黑白名单管理、网页防篡改功能等模块。能够为用户提供实时的网站安全防护&…...

11.7 堆排序

目录 11.7 堆排序 11.7.1 算法流程 11.7.2 算法特性 11.7 堆排序 Tip 阅读本节前&#xff0c;请确保已学完“堆“章节。 堆排序&#xff08;heap sort&#xff09;是一种基于堆数据结构实现的高效排序算法。我们可以利用已经学过的“建堆操作”和“元素出堆操作”…...

Patchwork++:基于点云的快速、稳健的地面分割方法

1. 背景 论文发表在2022IROS&#xff0c;是Patchwork的改进版本。算法通过数学方法进行快速而鲁棒性很强的地面分割&#xff0c;在智能机器人上的可操作性非常强。通过微调算法&#xff0c;可以应用于16-beams等多种规格的激光雷达。由于激光雷达点云数据标注的难度非常大&…...

Llama改进之——分组查询注意力

引言 今天介绍LLAMA2模型引入的关于注意力的改进——分组查询注意力(Grouped-query attention,GQA)1。 Transformer中的多头注意力在解码阶段来说是一个性能瓶颈。多查询注意力2通过共享单个key和value头&#xff0c;同时不减少query头来提升性能。多查询注意力可能导致质量下…...

英伟达开源新利器NV-Embed向量模型,基于双向注意力的LLM嵌入模型,MTEB 56项任务排名第一

前言 文本嵌入模型能够将文本信息转化为稠密的向量表示&#xff0c;并在信息检索、语义相似度计算、文本分类等众多自然语言处理任务中发挥着关键作用。近年来&#xff0c;基于解码器的大型语言模型 (LLM) 开始在通用文本嵌入任务中超越传统的 BERT 或 T5 嵌入模型&#xff0c…...

JVM之【GC-垃圾清除算法】

Java虚拟机&#xff08;JVM&#xff09;中的垃圾收集算法主要分为以下几种&#xff1a; 标记-清除算法&#xff08;Mark-Sweep&#xff09;复制算法&#xff08;Copying&#xff09;标记-整理算法&#xff08;Mark-Compact&#xff09;分代收集算法&#xff08;Generational C…...

数据分析每周挑战——心衰患者特征数据集

这是一篇关于医学数据的数据分析&#xff0c;但是这个数据集数据不是很多。 背景描述 本数据集包含了多个与心力衰竭相关的特征&#xff0c;用于分析和预测患者心力衰竭发作的风险。数据集涵盖了从40岁到95岁不等年龄的患者群体&#xff0c;提供了广泛的生理和生活方式指标&a…...

单例模式(Java实现)

我的相关文章&#xff1a; JavaSE 学习记录-CSDN博客 多线程笔记-CSDN博客 单例模式&#xff08;Java实现&#xff09;-CSDN博客 JUC笔记-CSDN博客 注解与反射&#xff08;Java&#xff0c;类加载机制&#xff0c;双亲委派机制&#xff09;-CSDN博客 1. 懒汉式线程不安全 pu…...

24.面向对象六大原则

目录介绍 00.面向对象六大原则01.代码单一职责原则02.代码开放封闭原则03.代码里氏替换原则04.代码依赖倒置原则05.代码接口隔离原则06.代码迪米特原则00.面向对象六大原则 六大原则一句话介绍 单一职责原则:指一个类的功能要单一,不能包罗万象。开放封闭原则:指一个模块在扩…...

ubuntu搭建nfs服务centos挂载访问

在Ubuntu上设置NFS服务器 在Ubuntu上&#xff0c;你可以使用apt包管理器来安装NFS服务器。打开终端并运行&#xff1a; sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享&#xff0c;例如/shared&#xff1a; sudo mkdir /shared sud…...

从WWDC看苹果产品发展的规律

WWDC 是苹果公司一年一度面向全球开发者的盛会&#xff0c;其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具&#xff0c;对过去十年 WWDC 主题演讲内容进行了系统化分析&#xff0c;形成了这份…...

【WiFi帧结构】

文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成&#xff1a;MAC头部frame bodyFCS&#xff0c;其中MAC是固定格式的&#xff0c;frame body是可变长度。 MAC头部有frame control&#xff0c;duration&#xff0c;address1&#xff0c;address2&#xff0c;addre…...

《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》

引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...

从零实现富文本编辑器#5-编辑器选区模型的状态结构表达

先前我们总结了浏览器选区模型的交互策略&#xff0c;并且实现了基本的选区操作&#xff0c;还调研了自绘选区的实现。那么相对的&#xff0c;我们还需要设计编辑器的选区表达&#xff0c;也可以称为模型选区。编辑器中应用变更时的操作范围&#xff0c;就是以模型选区为基准来…...

《Playwright:微软的自动化测试工具详解》

Playwright 简介:声明内容来自网络&#xff0c;将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具&#xff0c;支持 Chrome、Firefox、Safari 等主流浏览器&#xff0c;提供多语言 API&#xff08;Python、JavaScript、Java、.NET&#xff09;。它的特点包括&a…...

转转集团旗下首家二手多品类循环仓店“超级转转”开业

6月9日&#xff0c;国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解&#xff0c;“超级…...

基于数字孪生的水厂可视化平台建设:架构与实践

分享大纲&#xff1a; 1、数字孪生水厂可视化平台建设背景 2、数字孪生水厂可视化平台建设架构 3、数字孪生水厂可视化平台建设成效 近几年&#xff0c;数字孪生水厂的建设开展的如火如荼。作为提升水厂管理效率、优化资源的调度手段&#xff0c;基于数字孪生的水厂可视化平台的…...

视频字幕质量评估的大规模细粒度基准

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用&#xff0c;因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型&#xff08;VLMs&#xff09;在字幕生成方面…...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)

设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile&#xff0c;新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...