C/C++ 中的a++与++a

首先 a++和++a 的定义:看个例子
A:    a=5;  b=++a; // 相当于a=a+1;b=a;  结果是a=6,b=6
B:    a=5;  b=a++; // 相当于b=a;a=a+1; 结果是a=6,b=5
所以书上有:
 (1)   如果用前缀运算符对一个变量增1(减1),则在将该变量增1(减1)后,用新值在表达式中进行其他的运算。
 (2)   如果用后缀运算符对一个变量增1(减1),则用该变量的原值在表达式中进行其他的运算后,再将该变量增1(减1)后。

这里就有个问题,对于后缀运算,”用该变量的原值在表达式中进行其他的运算后“该如何理解,也就是说啥时才算表达式运算完啦。
举个列子:求a的最终值

int a=3;a+=a+=a++*a--;计算过程如下:先算a++*a-- 由于a=3 a++等于3 //这里后缀++中的第二步自加运算还没有进行a--等于3 //这里后缀--中的第二步自减运算还没有进行所以 ++*a-- 等于9a+=a++*a-- 等于a+=9等于a=a+9=3+9=12在算a+=a 等于a=a+12=12+12=24 然后在进行再后缀++中的第二步自加运算和后缀--中的第二步自减运算即进行 a=a+1;此时a=25;再进行a=a-1;此时a=24 所以最终a=24

说明在一个表达中,无论有多少个等号(赋值号)都必须进行完所有的运算符后,才能进行后缀自加,自减。那么什么时候才能算本计算单位已经结束。下面某些摘自《C语言深度剖析》i++ 在遇到每个逗号,分号后,才认为本计算单位已经结束,i 这时候自加。关于逗号表达式与“++”或“--”的连用,还有一个比较好的例子:int x;int i = 3;x = (++i, i++, i+10);问 x的值为多少?i的值为多少?按照上面的讲解,可以很清楚的知道,逗号表达式中,i 在遇到每个逗号后,认为本计算单位已经结束,i 这时候自加。所以,本例子计算完后,i的值为5,x的值为 15。

关于符号的贪心法C 语言有这样一个规则:每一个符号应该包含尽可能多的字符。也就是说,编译器将程序分解成符号的方法是,从左到右一个一个字符地读入,如果该字符可能组成一个符号,那么再读入下一个字符,判断已经读入的两个字符组成的字符串是否可能是一个符号的组成部分;如果可能,继续读入下一个字符,重复上述判断,直到读入的字符组成的字符串已不再可能组成一个有意义的符号。这个处理的策略被称为“贪心法” 。需要注意到是,除了字符串与字符常量,符号的中间不能嵌有空白(空格、制表符、换行符等) 。比如:==是单个符号,而==是两个等号。   按照这个规则可能很轻松的判断 a+++b表达式与 a++ +b一致。那++i+++i+++i;会被解析成什么样子呢?希望读者好好研究研究。另外还可以考虑一下这个表达式的意思a+++++b?

分析:++i+++i+++i   由于后缀自增,自减优先级比前缀高(ANSI/ISO C++中),编译器等效理解为++(i++)+(i++)+i,而i++不可以作左值,所以++(i++)错误,故此表达式错误a+++++b   编译器将其理解为(a++)++ +b, 由于a++不可以作左值,所以(a++)++错误,故此表达式错误 

另外特别注意 ++i在C中不是左值,在C++中才是。在C语言中像 int i=0,a=2,b=3;++i=a+b;这个表达式是非法的。i++在C和C++中都不能作左值。

http://blog.163.com/[email protected]/blog/static/1657478212010722953444/
时间: 2024-07-30 22:28:39

C/C++ 中的a++与++a的相关文章

win10周年版eNSP中启动AR提示错误代码40问题

win 10操作系统中安装eNSP 1.2.00.380,一直运行正常,但在2016年11月升级win 周年版之后,启动AR时启动失败,提示错误代码40. 卸载eNSP及VirtualBox之后重装问题依旧.按照论坛和网上各种说法更新virtualbox修改虚拟网卡设置,或者重新注册都无法解决,最终多方查找终于找到解决方案. 环境:win10 周年版,eNSP 1.2.00.380,VirtualBox 4.2.8 eNSP注册后virtualbox管理器中会出现AR_Base,WLAN_AC_

css中的px、em、rem 详解

概念介绍: 1.px (pixel,像素):是一个虚拟长度单位,是计算机系统的数字化图像长度单位,如果px要换算成物理长度,需要指定精度DPI(Dots Per Inch,每英寸像素数),在扫描打印时一般都有DPI可选.Windows系统默认是96dpi,Apple系统默认是72dpi. 2.em(相对长度单位,相对于当前对象内文本的字体尺寸):是一个相对长度单位,最初是指字母M的宽度,故名em.现指的是字符宽度的倍数,用法类似百分比,如:0.8em, 1.2em,2em等.通常1em=16px

angularJs中关于ng-class的三种使用方式说明

在开发中我们通常会遇到一种需求:一个元素在不同的状态需要展现不同的样子. 而在这所谓的样子当然就是改变其css的属性,而实现能动态的改变其属性值,必然只能是更换其class属性 这里有三种方法: 第一种:通过数据的双向绑定(不推荐) 第二种:通过对象数组 第三种:通过key/value 下面简单说下这三种: 第一种:通过数据的双向绑定 实现方式: function changeClass(){   $scope.className = "change2"; } <div clas

Uploadify/uploadifive上传(中文文档)

Uploadify是一款基于JQuery的优秀的文件/图片上传的插件,有基于Flash和HTML5两种版本. Uploadify/uploadifive主要特点有: 1. 多文件上传 2. 个性化设置 3. 上传进度条显示 4. 拖拽上传(HTML5版本) 官网:http://www.uploadify.com 部署 在部署一个Uploadify实例前,请确保满足最低要求: 1.jQuery 1.4.x 或更高版本 2.Flash Player 9.0.24 或更高版本 3.支持PHP, ASP

XShell 连接虚拟机中的服务器 失败 、连接中断(Connection closed by foreign host.)

在使用XShell连接虚拟机中的服务器时,报以下错误并断开连接,之前连接还是挺稳定的,忽然就这样了 Last login: Thu Aug 10 21:28:38 2017 from 192.168.1.102 [[email protected] ~]# Socket error Event: 32 Error: 10053. Connection closing...Socket close. Connection closed by foreign host. Disconnected f

微信浏览器中调用支付宝支付

众所周知,在微信浏览器中是无法唤起支付宝的,会提示请在浏览器中打开,如果非要在微信浏览器中调起支付宝的话,只能是跳出微信浏览器,关于这一点,在支付宝官网给出了一个例子.但是,话说回去,后来我仔细想想,其实真的没有必要非要在微信浏览器中调起支付宝支付(当时真是一根筋啊啊啊...) 支付宝手机网站支付的官方文档: https://doc.open.alipay.com/docs/doc.htm?treeId=203&articleId=105288&docType=1 快速接入: https:

C#中Dictionary的介绍

关键字:C# Dictionary 字典 作者:txw1958原文:http://www.cnblogs.com/txw1958/archive/2012/11/07/csharp-dictionary.html 说明    必须包含名空间System.Collection.Generic     Dictionary里面的每一个元素都是一个键值对(由二个元素组成:键和值)     键必须是唯一的,而值不需要唯一的     键和值都可以是任何类型(比如:string, int, 自定义类型,等等

C#中使用ffmpeg合并视频

首先将最新的ffmpeg.exe放到debug路径下,下载地址 http://www.ffmpeg.org/download.html 然后调用此方法 public void CombineMp4WithoutTxt(string StrMP4A, string StrMP4B, string StrOutMp4Path) { Process p = new Process();//建立外部调用线程 p.StartInfo.FileName = System.Windows.Forms.Appl

Javascript中call的使用

call 方法应用于:Function 对象调用一个对象的一个方法,以另一个对象替换当前对象.call([thisObj[,arg1[, arg2[,   [,.argN]]]]])参数:thisObj 可选项.将被用作当前对象的对象. arg1, arg2, , argN 可选项.将被传递方法参数序列. 说明:call 方法可以用来代替另一个对象调用一个方法.call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象.如果没有提供 thisObj 参数,那么 G

微信公众号中添加外部链接地址的图文教程

2017-9-18,长沙,有点闷,有点热. 本教程教大家如何在微信公众号中,添加外部的链接,网络有很多教程,但由于表述不太清楚,出个教程吧.最终实现在微信后台管理平台"原文链接"处插入外部链接,用户点击发布好的图文文章底部左下角的"阅读原文",就可以跳转到您添加的外部链接页面中去. 第1步. 使用微信公众管理帐号登陆微信管理后台 > 素材管理 > 图文消息 >  新建图文消息或者编辑文章都可以,如下图所示: 第2步. 之后,将页面向下拉,看到底部&