(++i)+(++i) 与 Sequence Point

Apollo control模块横向控制原理及核心代码逐行解析 看完这篇文章,你会对apollo横向控制有一个整体的概念 阅读详情

转自:

http://www.cnblogs.com/Levins/archive/2004/11/25/68572.html

看见有个面试题目,求x, y的值:

int i = 3, j = 3; int x = (++i) + (++i) + (++i); int y = (j++) + (j++) + (j++);

看到挺多人在争论,这样的表达式值应该是多少?甚至拿出几个不同的编译器来编译运行得到几个不同的结果。对于此题的答案,一句话,The behavior is undefined! 详细解释待我慢慢说来。

大家知道,通常而言,我们写的计算机程序都是从上到下,从左到右依次执行。然而,我只是说通常,因为在编译的过程中,compiler并不仅仅是把source code翻译成binary code就算了,这个过程里面可能还会对代码进行优化,这种优化可能带来的结果是:代码或者表达式evaluation的顺序可能发生变化。这可是一个非常严重的问题,当某个表达式带有side-effect(比如改变了一个变量的值),那么它的执行顺序直接影响到了程序执行的结果。

为了保证程序执行具有确定性的结果,C++标准引入Sequence Point这个概念,按照ISO/IEC的定义:

At certain specified points in the execution sequence called sequence points. All side effects of previous evaluations shall be complete and no side effects of subsequent evaluations shall have taken place.

简而言之,Sequence Point就是这么一个位置,在它之前所有的side effect已经发生,在它之后的所有side effect仍未开始,而两个Sequence Point之间所有的表达式或者代码执行的顺序是未定义的!

而C++标准又进一步规定了Sequence Point出现的5种情况:

  • At the end of a full expression
  • After the evaluation of all function arguments in a function call and before execution of any expressions in the function body
  • After copying of a returned value and before execution of any expressions outside the function
  • After evaluation of the first expression in a&&b,  a||b,  a?b:c,  or  a,b
  • After the initialization of each base and member in the constructor initialization list

具体我不详细讨论,只看第一个情况:At the end of a full expression,这里简化问题,full expression简单认为是一个带有;的语句(具体可以再去查标准)。也就是说,任何一个独立的表达式语句的结束都是一个Sequence Point,回到我们的题目:

int y = (++i) + (++i) + (++i);

整个的语句里面,只有1个Sequence Point,也就是语句的结束点,对于右边表达式的计算顺序没有任何的规定,显然,各种编译器都可以按照他们觉得“舒服”的方式来进行计算,这样的代码,如果只要求在特定的平台或者编译器运行,那么带来的可能只是可读性差的问题,但如果考虑跨平台或者编译器的情况,那么就是完完全全的错误!

另外,需要特别注意的是,对于赋值号(assignment operator),C++也没有把它定义成Sequence Point,也就说这样的语句:

buffer[i] = i++;

同样是undefined的,因为,对于等号左右两边的表达式运算顺序,你并不能有任何的假定。

 

 

Ollama内网离线部署大模型实战:从模型文件到私有化服务 本文详细介绍了如何在内网离线环境下,利用Ollama部署私有化大模型服务。内容涵盖从获取GGUF格式模型文件、手动安装Ollama、编写核心Modelfile配置文件,到创建运行模型、性能调优及安全加固的全流程实战指南,旨在帮助企业安全、可控地构建内部AI能力。 阅读详情

相关推荐

告别手动下载!用Python脚本5分钟搞定NREL风速数据(附完整API调用代码)

本文详细介绍了如何使用Python脚本自动化获取NREL风速数据,从API密钥申请到数据保存的全流程。通过完整的API调用代码和实战技巧,帮助研究人员和开发者高效下载全球高精度风速数据,告别繁琐的手动操作,提升工作效率。

weixin_33724059的博客 297

Anex C 中的side effect 和 sequence point

<br />只有在sequence point之间的读写顺序确定的时候才能消除side effect.<br />比如<br />a[i++] = i,这实际上是错误的。不能保证结果<br />但是<br />i = i+1就可以,因为若需要计算i+1,则必须读出i.<br />同理<br />(++a) + (++a) + (++a)<br />这样的写法也是错误的,不能保证结果,因为运算符的顺序不能保证sequence point.

366

c#源码,将矩阵(二维数组)渲染成云图,强度图,热力图,均匀性图,伪彩图

优快云软件0积分下载链接:https://download.youkuaiyun.com/download/wanghuannihao1992/86656759。6、渲染效果良好,颜色均匀分布,不存在等高线,交叉点。3、纯粹的C#代码编写,不含第三方dll或者控件。4、支持ColorBar显示,强度值颜色坐标显示。2、渲染时间60ms左右,速度快,1、二维数据最小支持2*2,7、采样全新数据插值算法。先直接上C#软件效果图。5、整图保存为单个图片。

业余程序员小徐的博客 6880

Side Effect与Sequence Point

Side Effect 改变计算机存储单元里的数据或者做输入或输出操作,这些都算Side Effect。 比如: int a = 10; /* a这个表达式在这里没有副作用,这里只是想要取得a这个变量的值10 */ int b = a; /*,而b = a这个表达式有副作用,它的副作用是使b的值改变成a的值*/ 正是因为有了副作用,很多功能才得以完成。有些表...

diyudong4681的博客 205

从零到一:高通QCS6490边缘AI开发板的Linux生态构建与实战避坑指南

本文详细介绍了在高通QCS6490边缘AI开发板上构建Linux生态系统的完整流程,包括开发环境准备、系统镜像构建与烧录、AI运行时环境配置、模型部署优化以及性能调试。重点解析了如何利用Hexagon DSP的高达12 TOPS AI算力,并提供了实战中的避坑指南和性能优化技巧,帮助开发者高效实现边缘AI应用从概念验证到产品落地的全过程。

eee77的博客 770

AI Agent技术架构与规模化应用:2025年技术深度解析

2025年,AI Agent(人工智能智能体)迎来了规模化应用的拐点时刻。根据Gartner等权威机构预测,企业软件中整合自主型AI的比例将从2024年的不足1%跃升至2028年的33%。本文深入剖析AI Agent的核心技术架构,从规划模块、记忆模块、工具调用模块到底层实现原理,结合Python和Go语言的实际代码示例,全面阐述AI Agent的技术实现路径。同时,本文探讨多智能体协作系统、企业级部署架构以及未来的技术演进方向,为开发者和技术决策者提供系统性的技术参考。关键词:AI Agent、大语言模型

shao.bing的专栏 1348

C/C++中的side effect(负效应) 和sequence point(序列点)

  不知你在写code时是否遇到这样的问题?int i = 3; int x = (++i) + (++i) + (++i); 问x值为多少?进行各种理论分析,并在编译器上实践,然而可能发现最终的结果是不正确的,也是不稳定的,不同的编译器可能会产生不同的结果。这让人很头疼。结果到底是啥呢?对于此题的答案,一句话,Theresult is undefined! 详细解释待我慢慢说来。  ...

dengdiaoji0891的博客 332

AI Agent ReAct架构设计模型剖析

ReAct通过"思考-行动-观察"循环运作:智能体先进行自然语言推理,再调用外部工具执行行动,观察结果后继续推理直至解决问题。这种架构提高了透明度和准确性,减少幻觉风险,使LLM能主动分解任务并利用外部数据源。实现关键在于精心设计的提示模板,引导LLM按结构化格式响应,而非依赖模型固有能力。

weixin_43939320的博客 1249

sequence point

顺序点,C语言冰山位于海面下的角落。 副作用side effect,简单理解就是变量值被改变这个事实。i++这个表达式,副作用就是i被增加1。a = 10;这个表达式,副作用就是a被赋值成10。 一个复杂的表达式,其求值过程是有迹可循的。例如:i++ + ++i 这个表达式,根据运算符的结合性或优先级关系,可以被人为是如下等效形式:(i++) + (++i).现在的问题来了,它的求值结果是什么?答案是:未定义行为(undefined)。未定义的意思是:无法预测结果。对比另一个叫做为未指定行为(unspeci

audi2的专栏 841

STM32F407-OV7670(无FIFO)-ONENET-实现摄像头画面上传到onenet(EDP协议)

EDP协议 EDP协议文档说明:https://leoeinstein.lanzous.com/ifX1Ckfkaaf 服务器登录 登录流程: (1)客户端发送连接请求(CONN_REQ) (2)服务器验证请求的合法性 (3)服务器发送一个回执(CONN_RESP)给客户端 其中请求包含三部分:消息头、选项和消息体。 1、消息头 包括消息的类型和剩余消息长度。 2、选项 包括协议名称、协议版本、连接标志、保持连接时间。 3、消息体 可能包含设备ID、用户ID(可选)、鉴权信息(看采取什么方式登录)。 设备

LiangWF22的博客 1万+

Claude Code 学习笔记之一:理解 Agentic Loop 与内置工具

本文介绍了Claude Code这一终端智能助手的工作原理与使用方式。作者从ABAP开发经验出发,指出学习Claude Code的高级用法具有长期价值。文章详细解析了Claude Code的Agentic Loop机制:通过大语言模型进行推理,借助各类工具执行任务,并循环收集上下文、执行操作、验证结果三个步骤。系统阐述了Claude Code支持的五大类工具及其扩展方式,说明了其访问本地资源的范围和自治处理能力,同时介绍了权限模式等安全机制。最后提供了从小任务开始、充分探索、及时引导、使用CLAUDE.md

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 545

C++分享点:sequence point 和 side effect

1.C++分享点:sequence point sequence point:At certain specified points in the execution sequence。 简而言之,Sequence Point就是这么一个位置,在它之前所有的side effect已经发生,在它之后的所有side effect仍未开始。 比如题目: int x = (++i) + (++i) +...

lengji22的专栏 393

基于遗传算法改进BP神经网络的电池容量SOC预测

,遗传算法BP神经网络能很好的实现对电池容量soc的训练和预测,BP神经网络是一种成熟的神经,相对于其他神经网络,拥有很多的训练函数,传递函数,可以调节的参数非常多,对各种问题都可以达到一个比较理想的效果,关键看如何调试参数,选择训练传递函数,遗传算法改进BP神经网络的初始权值阈值,达到改进BP神经网络的目的,从而更好的实现对电池容量SOC的预测

abc991835105的博客 765

C语言中的序列点(sequence point)和副作用(side effects)

目录 1. 副作用(side effect) 2.序列点(sequence point) 遵循原则: 了解序列点之前先来看下副作用: 1. 副作用(side effect) 看下边代码: int factorial(int n) { int result = 1; int i; for(i = 1; i <= n; ++i) result = result * i; return result; } 其中++i这个表达式相当于i =...

qq_27898413的博客 2149

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

i++ : 顺序点(sequence point) 与 副作用 (side effect)

表达式的计算分为两种,一种是有副作用的计算,如:  (++x)+y  一种是无副作用的计算,如:  x*y  有副作用的计算中,子表达式的计算顺序是重要的。例如  (++x)*(x+1)  当x=0时,如果先算++x,上式计算结果为2,如果先算x+1,上式计算结果为1。  再如,对函数g(int, int)的调用g(x, ++x), 当x=1,这个调用是g(1, 2)还是g(2,

Geek Nero 1121

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

C语言Side Effect与Sequence Point

转自:http://docs.linuxtone.org/ebooks/C&CPP/c/ch16s03.html Side Effect与Sequence Point 如果你只想规规矩矩地写代码,那么基本用不着看这一节。本节的内容基本上是钻牛角尖儿的,除了Short-circuit比较实用,其它写法都应该避免使用。但没办法,有时候不是你想钻牛角尖儿,而是有人逼你去钻牛角尖儿。这是我们的学员

小问蓝晨的专栏 563

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

C拾遗(二)Side Effect和Sequence Point

1.何时产生Side Effect ? (1)调用一个函数时 (2)使用某些运算符时,比如(++--=复合赋值) 2.何时产生Sequence Point ? (1)函数开始调用之前,比如foo(f(),g())在调用foo()之前内部参数表达式或函数计算完之后是Sequence Point (2)条件运算符、逗号运算符、逻辑与、逻辑或第一个表达式计算完成后 (3)在一个完整的生命末尾

地狱未空,誓不成佛 901

i++ : 顺序点(sequence point) 与 副作用 (side effect)(转)

声明:文章转自  http://www.cnblogs.com/smwikipedia/articles/1229984.html 表达式的计算分为两种,一种是有副作用的计算,如:  (++x)+y  一种是无副作用的计算,如:  x*y  有副作用的计算中,子表达

VCACC的专栏 635

Sequence Point 顺序点

1)在函数调用之前,对函数的所有参数的求值必须全部完成 2)一旦一个函数开始执行, 调用者函数中的表达式将不会开始求值,或继续求值,直至被调用函数执行结束,函数执行永远不会交叉进行. 3)如果函数参数是表达式,这些表达式通常可以按任何次序求值,包括交叉求值. 对于f(expr1, expr2) 编译器可能先对expr1 求值,也可能后对expr1求值,或者让expr1 和 expr2 的求值交叉进...

weixin_30911451的博客 93
上一篇: C++ Primer学习笔记 (二)
下一篇: 开发者版本:你属于哪个版本的程序员?
K行天下
博客等级 码龄19年 358粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值