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

C语言中的副作用、序列点以及复杂表达式的求值顺序

C语言中复杂表达式的求值顺序

num = (5 + 2) * (9 * 6);

如果我问你:上面的c程序在执行的时候到底是先算(5 + 2)还是(9 * 6)?你会怎么回答?

无非就两种:先算(5 + 2)或者先算(9 * 6)对吧?那么我来告诉你,这两种结果都不对,答案是不确定,你应该先问编译器。

副作用和序列点

在解释上面的概念之前,我们先来介绍两个专业术语:副作用、序列点

副作用

副作用(side effect)是指对数据对象或文件的修改。
例如:

states = 50;

它的副作用是将变量的值设置为50。

看起来,副作用更像是主要目的,其实并不是。从C语言的角度来看,上面的代码的主要目的是对表达式求值。

给出4 + 6,C会对齐求值得到10,同理,给出states = 50;C语言会对其进行求值得到50。

在C语言的眼里,上面的程序更像是这样的:

(states = 50);

类似的,printf函数显示的信息其实是它的副作用(printf的返回值是待显示字符的个数,也就是放入输出缓冲区字符的个数),不懂缓冲区的可以看我的这篇文章:你真的理解printf函数吗?

序列点

序列点(sequence point)是程序执行的点,在这个点上,所有的副作用都会在进入下一步之前发生。语句中的分号标记了一个序列点。

分号的意思是:在这个语句之前,赋值运算符、递增运算符和递减运算符对运算对象做的改变必须在程序执行下一条语句之前完成。

求值顺序

C把先计算哪一个部分的决定权留给编译器的设计者,以便针对特定系统优化设计。
也就是说,对于开始的那个程序,哪一段表达式先被计算是不确定的。

但是,对于逻辑运算是个例外。

在C语言中,保证逻辑表达式的求值顺序是从左往右。&&和||都是序列点,所以一个程序在从一个运算对象执行到下一个运算对象之前,所有的副作用都会生效。

并且,重要的一点是,C一旦发现某个元素让表达式无效,便立即停止求值。

有了上面的规则,才能写出下面的代码:

while ((c = getchar()) != ' ' && c != '\n');

在上面的代码中,读取字符直到遇到第一个空格或者换行符停止,需要注意的是,如果没有上面的规则,c != '\n'这个语句就有可能在c = getchar()之前执行了,这样一来,就不能保证语义的正确性了。

相关文章:

C语言中的副作用、序列点以及复杂表达式的求值顺序

C语言中复杂表达式的求值顺序 num (5 2) * (9 * 6);如果我问你:上面的c程序在执行的时候到底是先算(5 2)还是(9 * 6)?你会怎么回答? 无非就两种:先算(5 2&#xff…...

C++学习笔记——队列模拟

目录 一、模拟队列 二、模拟队列的知识点 三、队列 3.1入队操作 3.2出队操作 3.3访问队首元素 3.4访问队尾元素 3.5判断队列是否为空 3.6获取队列的大小 四、实现队列的基本功能 一、模拟队列 当涉及到数据存储和处理时,队列是一种常见的数据结构&#x…...

jvm垃圾回收相关的算法

什么是垃圾 JVM主要通过以下几种方式来判断对象是否需要回收: 引用计数法:JVM通过引用计数器来判断对象的引用数量,当引用数量为0时,表示对象可以被回收。 可达性分析算法:JVM通过根对象(如栈中的引用、静…...

每日coding

2085、统计出现过一次的公共字符串 给你两个字符串数组 words1 和 words2 ,请你返回在两个字符串数组中 都恰好出现一次 的字符串的数目。 示例 1: 输入:words1 ["leetcode","is","amazing","as"…...

软件工程_复习

软件工程 软件危机(1968 60年代) 产生软件危机的原因: 一方面与软件本身的特点有关,另一方面也和软件开发和维护的方法不正确有关。 与软件本身特点有关: 1.软件不同于硬件,软件是计算机系统中的逻辑部件,缺乏“可见性”,管理和控制软件开发过程相当困难 2.软件在运行过…...

07GoF之三种工厂模式

GoF(Gang of Four):四人组,《Design Patterns: Elements of Reusable Object-Oriented Software》(《设计模式》)的作者,设计了23种设计模式.但时代发展,还有其它的设计模式,比如:JavaEE的设计模式(DAO模式…...

JAVA面试部分——后端-线程前篇

3.1 线程和进程 在计算机科学中,进程和线程是操作系统管理资源的两种不同方式。 进程(Process):是程序在计算机上的一次执行活动。每个进程都有自己的内存空间,包括代码、数据和系统资源。一个进程可以包含多个线程。…...

【小沐学C++】C++ 实现鼠标键盘钩子HOOK

文章目录 1、简介2、相关函数2.1 SetWindowsHookEx2.2 UnhookWindowsHookEx2.3 CallNextHookEx 3、相关结构体3.1 KBDLLHOOKSTRUCT3.2 MSLLHOOKSTRUCT 4、挂钩过程5、代码测试5.1 代码1 结语 1、简介 https://learn.microsoft.com/zh-cn/windows/win32/winmsg/about-hooks 挂…...

【pycharm】常见问题与解决

记录一些Pycharm中经常遇到的问题 1. “Open file or Project” always in loading state (hang) a) 老版本 (2021年左右) since build 211.6693.14, it is possible to use a native file chooser on Windows. The feature is experimental; to enable it, add the followi…...

flask web学习之表单(一)

文章目录 一、使用Flask-WTF处理表单1.1 安装Flask-WTF库1.2 定义WTForms表单类常用的WTForm字段实例化字段类常用参数常用的WTForm验证器 1.3 输出HTML代码使用render_kw属性在调用字段时传入 1.4 在模板中渲染表单 在web程序中,表单是用户交互最常见的方式之一。用…...

@ControllerAdvice 使用场景

ControllerAdvice 是Spring 框架中的注解,多用在Spring MVC应用程序中。 使用场景1:处理异常 # 示例1 import org.apache.ibatis.javassist.NotFoundException; import org.springframework.http.HttpStatus; import org.springframework.http.Respons…...

二极管选型怎么选?常用参数要熟练~

同学们大家好,今天我们继续学习杨欣的《电子设计从零开始》,这本书从基本原理出发,知识点遍及无线电通讯、仪器设计、三极管电路、集成电路、传感器、数字电路基础、单片机及应用实例,可以说是全面系统地介绍了电子设计所需的知识…...

【小白专用】C#关于角色权限系统

(C#)用户、角色、权限 https://www.cnblogs.com/huangwen/articles/638050.html 权限管理系统——数据库的设计(一) https://www.cnblogs.com/cmsdn/p/3371576.html 权限管理系统——菜单模块的实现(二) …...

代码随想录算法训练营

一刷打卡记录: 日期打卡2023/10/25 day01二分查找有点转不过弯,快慢指针能理解,自己写也可能写不出来,但是能记住了,能看懂,还有其他解法待补充看完,花了挺长时间的2023/10/26 day02还好&#…...

统计学-R语言-3

文章目录 前言给直方图增加正态曲线的不恰当之处直方图与条形图的区别核密度图时间序列图洛伦茨曲线计算绘制洛伦茨曲线所需的各百分比数值绘制洛伦茨曲线 练习 前言 本篇文章是介绍对数据的部分图形可视化的图型展现。 给直方图增加正态曲线的不恰当之处 需要注意的是&#…...

spring动态控制定时任务

在spring框架中,对于简单的定时任务,可以使用 Scheduled 注解实现,在实际项目中,经常需要动态的控制定时任务,比如通过接口增加、启动、停止、删除定时任务,动态的改变定时任务的执行时间等。 我们可以通过…...

3. Mybatis 中SQL 执行原理

2. Mybatis 中SQL 执行原理 这里有两种方式,一种为常用的 Spring 依赖注入 Mapper 的方式。另一种为直接使用 SqlSessionTemplate 执行 Sql 的方式。 Spring 依赖注入 Mapper 的方式 Mapper 接口注入 SpringIOC 容器 Spring 容器在扫描 BeanDefinition 阶段会扫…...

第一次在RUST官方论坛上留言发布我的Rust板箱

第一次在RUST官方论坛上发帖子,有点紧张~地址在这里: 【My Rust Crate】obtains linux local information - The Rust Programming Language Forum (rust-lang.org)...

LabVIEW 智能化矿用定向钻机液压系统监测

简介 在矿用定向钻机的液压系统监测中,实现实时监控和异常预警对于保障设备运行的稳定性至关重要。传统的人工监测方法效率低下而且准确性不能满足要求,针对这种情况采用 LabVIEW 开发平台,设计并实现了一套智能化矿用定向钻机液压系统的状态…...

GO数据库操作

Golang 出色的 ORM 库为 GORM。 官网文档:https://gorm.io/docs/ 我们来说说增删改查的用法,更深入的研究可以去官网看看。 GORM功能概览: 关联(有一个、有多个、属于、多对多、多态性、单表继承)挂钩(创…...

PyTorch简单理解ChannelShuffle与数据并行技术解析

目录 torch.nn子模块详解 nn.ChannelShuffle 用法与用途 使用技巧 注意事项 参数 示例代码 nn.DataParallel 用法与用途 使用技巧 注意事项 参数 示例 nn.parallel.DistributedDataParallel 用法与用途 使用技巧 注意事项 参数 示例 总结 torch.nn子模块详…...

MySQL 8查询语句之查询所有字段、特定字段、去除重复字段、Where判断条件

《MySQL 8创建数据库、数据表、插入数据并且查询数据》里边有我使用到的数据。 再使用下方的语句补充一些数据: insert into Bookbought.bookuser(id,username,userphone,userage,sex,userpassword) values (11,Book Break,22245678911,18,male,good#111); insert…...

LLaMA-Factory添加adalora

感谢https://github.com/tsingcoo/LLaMA-Efficient-Tuning/commit/f3a532f56b4aa7d4200f24d93fade4b2c9042736和https://github.com/huggingface/peft/issues/432的帮助。 在LLaMA-Factory中添加adalora 1. 修改src/llmtuner/hparams/finetuning_args.py代码 在FinetuningArg…...

多端多用户万能DIY商城系统源码:自营+多商户入驻商城系统 独立部署 带完整的安装代码包以及搭建教程

电子商务行业日新月异,许多企业希望能够通过线上商城拓展业务。但是,传统商城系统往往无法满足多样化、个性化的需求,而且开发周期长、成本高。罗峰就来给大家分享一款多端多用户万能DIY商城系统源码,搭建简单。 以下是部分代码示…...

Qt 6之七:学习资源

Qt 6之七:学习资源 Qt是一种跨平台的C应用程序开发框架,它提供了一套丰富的工具和库,可以帮助开发者快速构建跨平台的应用程序,用于开发图形用户界面(GUI)和非GUI应用程序。 Qt 6之一:简介、安…...

解决大模型的幻觉问题:一种全新的视角

在人工智能领域,大模型已经成为了一个重要的研究方向。然而,随着模型规模的不断扩大,一种新的问题开始浮出水面,那就是“幻觉”问题。这种问题的出现,不仅影响了模型的性能,也对人工智能的发展带来了新的挑…...

mysql进阶-重构表

目录 1. 原因 2. 如何重构表呢? 2.1 命令1: 2.2 命令2: 2.3 命令3: 1. 原因 正常的业务开发,为什么需要重构表呢? 原因1:某张表存在大量的新增和删除操作,导致表经历过大量的…...

Element-ui图片懒加载

核心代码 <el-image src"https://img-blog.csdnimg.cn/direct/2236deb5c315474884599d90a85d761d.png" alt"我是图片" lazy><img slot"error" src"https://img-blog.csdnimg.cn/direct/81bf096a0dff4e5fa58e5f43fd44dcc6.png&quo…...

Linux系统——DNS解析详解

目录 一、DNS域名解析 1.DNS的作用 2.域名的组成 2.1域名层级结构关系特点 2.2域名空间构成 2.3域名的四种不同类型 2.3.1延伸 2.3.2总结 3.DNS域名解析过程 3.1递归查询 3.2迭代查询 3.3一次DNS解析的过程 4.DNS系统类型 4.1缓存域名服务器 4.2主域名服务器 4…...

初识Ubuntu

其实还是linux操作系统 命令都一样 但是在学习初级阶段&#xff0c;我还是将其分开有便于我的学习和稳固。 cat 查看文件 命令 Ubuntu工作中经常是用普通用户&#xff0c;在需要时才进行登录管理员用户 sudn -i 切换成管理用户 我们远程连接时 如果出现 hostname -I没有出现…...

中国旅游预订网站的建设始于哪一年/关键词app下载

本文同步自我得博客&#xff1a;http://www.joeray61.com 简介 WebRTC is a new front in the long war for an open and unencumbered web.这句话是JavaScript之父Brendan Eich对于WebRTC的评价&#xff0c;大致意思是『WebRTC是争取开放和无阻碍Web的漫长战争中一条新战线』。…...

网站建立数据库/茂名seo快速排名外包

public class DoubleClick : MonoBehaviour {float timelost 0;void Update(){if (Input.GetKeyDown(KeyCode.D)){if (Time.time - timelost < 0.5f)///0.5秒之内按下有效{/}timelost Time.time;}} }从游戏开始到到现在所用的时间&#xff08;只读&#xff09;。 Time.tim…...

响应式网站建设的未来发展6/网络推广员具体做什么的

Netty In Action中文版 - 第十五章&#xff1a;选择正确的线程模型 本章介绍 线程模型(thread-model)事件循环(EventLoop)并发(Concurrency)任务执行(task execution)任务调度(task scheduling)线程模型定义了应用程序或框架如何执行你的代码&#xff0c;选择应用程序/框架的正…...

洛阳网站设计开发/网站的营销策略

1、安装Brat只能在Linux下运行。先从官网下载安装包http://brat.nlplab.org/index.html&#xff0c;注意解压到一个不包含中文字符的目录下&#xff0c;不然安装后会报错。然后进入到brat-v1.3_Crunchy_Frog目录下。使用命令./install 就可以安装了。他会提示你输入登录名、密码…...

行业前10的网站建设公司/四川seo平台

应用情形1.员工a在 master 主分支上新建一个 newBranch 分支&#xff0c;然后开始在 newBranch 分支上开始编写代码。编写完成后将该分支提交到远程库。2.项目经理b在远程库上拉取 newBranch 分支&#xff0c;查看代码无误后将 newBranch 分支合并到 master 主分支&#xff0c;…...

模板网站建设哪家好/厦门seo关键词优化培训

我刚开始学习Java.在我关注的在线课程中,我被要求尝试以下代码&#xff1a;String email1 "mememe.coh";String email2 "mememe.com";Boolean isMatch false;isMatch email1.equals (email2);if (isMatch true){System.out.println("Emails matc…...