c语言之优先级 结合性与自增运算,C语言之优先级、结合性与自增运算

优先级、结合性这些概念在初学的时候并没有放在心上,今天又碰到这个问题,查了不少资料,再次做个总结。

在标准C语言的文档里,对操作符的结合性并没有做出非常清楚的解释。一个满分的回答是:它是仲裁者,在几个操作符具有相同的优先级时决定先执行哪一个。

每个操作符拥有某一级别的优先级,同时也拥有左结合性或右结合性。优先级决定一个不含括号的表达式中操作数之间的“紧密”程度。例如,在表达式a*b+c中,乘法运算的优先级高于加法运算符的优先级,所以先执行乘法a*b,而不是加法b+c。

但是,许多操作符的优先级都是相同的。这时,操作符的结合性就开始发挥作用了。在表达式中如果有几个优先级相同的操作符,结合性就起仲裁的作用,由它决定哪个操作符先执行。像下面这个表达式:

int a,b=1,c=2;

a=b=c;

我们发现,这个表达式只有赋值符,这样优先级就无法帮助我们决定哪个操作先执行,是先执行b=c呢?还是先执行a=b。如果按前者,a=结果为2,如果按后者,a的结果为1。

所有的赋值符(包括复合赋值)都具有右结合性,就是在表达式中最右边的操作最先执行,然后从右到左依次执行。这样,c先赋值给b,然后b在赋值给a,最终a的值是2。类似地,具有左结合性的操作符(如位操作符“&”和“|”)则是从左至右依次执行。

结合性只用于表达式中出现两个以上相同优先级的操作符的情况,用于消除歧义。事实上你会注意到所有优先级相同的操作符,它们的结合性也相同。这是必须如此的,否则结合性依然无法消除歧义,如果在计算表达式的值时需要考虑结合性,那么最好把这个表达式一分为二或者使用括号。

例:

a=b+c+d

=是右结合的,所以先计算(b+c+d),然后再赋值给a

+是左结合的,所以先计算(b+c),然后再计算(b+c)+d

C语言中具有右结合性的运算符包括所有单目运算符以及赋值运算符(=)和条件运算符。其它都是左结合性。

在C语言中有少数运算符在C语言标准中是有规定表达式求值的顺序的:

1:&& 和 || 规定从左到右求值,并且在能确定整个表达式的值的时候就会停止,也就是常说的短路。

2:条件表达式的求值顺序是这样规定的:

test ? exp1:exp2;

条件测试部分test非零,表达式exp1被求值,否则表达式exp2被求值,并且保证exp1和exp2两者之中只有一个被求值。

3:逗号运算符的求值顺序是从左到右顺序求值,并且整个表达式的值等于最后一个表达式的值,注意逗号','还可以作为函数参数的分隔符,变量定义的分隔符等,这时候表达式的求值顺序是没有规定的!

判断表达式计算顺序时,先按优先级高的先计算,优先级低的后计算,当优先级相同时再按结合性,或从左至右顺序计算,或从右至左顺序计算。

说完了优先级和结合性,下面说说自增运算符++

首先明白自增运算符的两种使用情况:

(1)、单独使用:i++;或者++1;这种情况下两者是没有区别的,i的值都会增加1;

(2)、在表达式中使用:a = i++;此时先取i的值赋给a,然后i的值自增,相当于a = i;i=i+1

a = ++i;此时先让i自增,然后将自增后的值赋给a,相当于i = i + 1;a = i

明白了自增的这两种情况,然后再来看看自增和结合性的混合情况:*p++ (*p)++ *(p++)三者的区别

对于*p++,首先*和++的优先级相同,然后看他们的结合性;由于优先级相同,那么他们的结合性必然也相同,都是右结合(从右至左)。

那么*p++ 就相当于*(p++),即根据右结合,p与++先结合形成(p++),然后再与*结合。

需要注意的一点(本文想着重说明的一点):虽然*(p++)中,p++被放在了括号内,此时应根据自增运算符++的两种情况来考虑(而不需要考虑结合性了,此时与结合性已经无关),显然这是上述的第二种情况,即在表达式中使用自增。所以是先取p的值与*结合,然后p值再自增,相当于*p,p++;千万不要被括号迷惑,认为括号中的东西先运算。

明白了上面一点,则对于*(++p)就很好理解,p先自增,然后与*结合。

对于下面的例子也不难理解:

例一:char q[5] = "am";char *p = q;

那么,

(*p)++后,p就变成了"bm";因为是进行对其首元素进行加1运算

*(p++)后,p就变成了"m",因为完成取值运算后,p++指向下一个元素,即m,

*p++与*(p++)一样。

如果只是征对这3个语句赋值给其他变量的话,3个的结果都是a,在这里。

char o = (*p)++;

char m = *(p++);

char n = *p++;

都是a。

例二:

int i = 0,a,b;

a = (i++)+(i++)+(i++);

b = (++i)+(++i)+(++i);

cout<

输出结果(gcc编译器):0 16 6

解释:这里特别注明是gcc编译器,在其他编译器下的值可能不同。

对于int a=(i++)+(i++)+(i++);先取出i值进行加运算,然后再执行i的三次自增; 在其他编译器下(如tc3.0),可能是0+1+2=3;

对于int b=(++i)+(++i)+(++i);每次i先自增,然后参与运算,所以是4+5+6=16.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/530093.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

android设置输入框输入字符限制,Android EditText限制输入字符的方法总结

Android EditText限制输入字符的方法总结最近项目要求限制密码输入的字符类型&#xff0c; 例如不能输入中文。 现在总结一下EditText的各种实现方式&#xff0c; 以比较各种方法的优劣。第一种方式&#xff1a; 设置EditText的inputType属性&#xff0c;可以通过xml或者Ja…

android动态改变菜单栏,Android动态设置主题(使用RxBus模式)

之前写过一篇文章&#xff1a;RxBus的实现及简单使用。今天我们尝试使用RxBus动态切换主题。一、定义主题颜色color.xml#F44336#D32F2F#F44336#E91E63#C2185B#E91E63#795548#5D4037#795548#2196F3#1976D2#2196F3#607D8B#455A64#607D8B#FFEB3B#FBC02D#FFEB3B#673AB7#512DA8#673A…

android 图片分析,Android图片处理实例分析

本文实例讲述了Android图片处理的方法。分享给大家供大家参考&#xff0c;具体如下&#xff1a;package cn.szbw.util;import Android.content.Context;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.graphics.Canvas;import android.…

android开发按钮颜色,Android编程实现简单设置按钮颜色的方法

本文实例讲述了Android编程实现简单设置按钮颜色的方法。分享给大家供大家参考&#xff0c;具体如下&#xff1a;1.工程目录a.在res目录-新建drawble文件夹放入自定义图片2.main.xmlandroid:orientation"vertical"android:layout_width"fill_parent"androi…

艾默生变频器ev1000故障代码_国产变频器型号大全,梳理国产变频的前世今生!...

在工控领域&#xff0c;变频器已经广为所知且应用范围广泛&#xff0c;各方对变频器能给出形形色色的描述。维基百科给出的定义&#xff1a;“变频器(variable frequency drive&#xff0c;常见缩写VFD)&#xff0c;也称为变频驱动器或驱动控制器。变频器是可调速驱动系统的一种…

android音乐播放器案例,Android MediaPlayer实现音乐播放器实例代码

Android MediaPlayer实现音乐播放器1、布局文件android:layout_width"fill_parent"android:layout_height"fill_parent"android:orientation"vertical" >android:id"id/hint"android:layout_width"wrap_content"android:…

单边指数信号的特点_今日股市分析:上证指数若能守住3400,蓄力反弹就有戏...

昨日整体概况上涨&#xff1a;848只 下跌&#xff1a;3009只涨停&#xff1a;69只 跌停&#xff1a;12只昨天的上证指数低开低走&#xff0c;午后冲红又回落&#xff0c;另一边的创业板却是单边下行跌超3%&#xff0c;板块方向农业、洪水概念股、还有电力板块较强。按照昨日置顶…

万丰科技机器人排名_机器人系统集成“7宗最”

摘要&#xff1a;对于众多集成商而言&#xff0c;作为典型的“夹心饼奥利奥”&#xff0c;面对客户的各种要求&#xff0c;“不敢勉强你&#xff0c;只好为难自己”系真实写照。1、企业数量最多GGII统计数据显示&#xff0c;截至2019年年底&#xff0c;中国工业机器人产业企业数…

android 电池高温关机,Android 关机问题分析指南

本篇文章主要介绍 Android 开发中的 关机 部分知识点&#xff0c;通过阅读本篇文章&#xff0c;您将收获以下内容:1 . 确认是亮屏关机还是灭屏关机&#xff1f;关机时是否有播放关机动画&#xff1f;2 . 是直接关机还是关机后会自动重启&#xff1f;3.异常关机时&#xff0c;连…

android switch 未定义,在switch语句中初始化时未定义的变量?

问题本身就是一个明显的答案.无论如何,这是我的代码片段......switch(cSet)...case 8:{ //Special CharactersfinalSet special;char* charSet new char[special.size() 1];charSet[special.size()] 0; //Append null terminatormemcpy(charSet, special.c_str(), special.…

android 克隆对象,克隆会破坏单例对象吗?

假设有这样一个场景&#xff0c;如果复制的目标对象恰好是单例对象&#xff0c;那会不会破坏单例对象呢&#xff1f;当然&#xff0c;我们在已知的情况下肯定不会这么干&#xff0c;但如果发生了意外怎么办&#xff1f;不防来修改一下代码。public class ConcretePrototype imp…

转网口显示未识别的网络_已有1700万用户携号转网 超99%用户1小时内办结

携号转网是利国利民的大举措&#xff0c;受到了很多电信用户的拥护和支持。12月15日&#xff0c;工信部副部长刘烈宏在某会议上进行报告指出&#xff0c;目前我国 “携号转网”服务已经累计有 1700 万用户完成携转&#xff0c;一小时携转成功办结率超过 99%。已有1700万用户携号…

adb 更新 android sdk,[转载]安装Android时SDK AVD MANAGER时更新报错的解决办法

最近安装Android SDK时&#xff0c;发现更新时出现“A folder failed to be renamed ormoved.”等类似错误。经过测试和G后发现解决办法目前有两种情况&#xff1a;1、确实是因为打开了相关目录或者其他程序占用率文件夹句柄。关闭相关资源管理器或者关闭相关程序即可&#xff…

2020.2idea怎么创建html项目_陈肆横项目日记:百度百科怎么创建自己的名字

百度百科是一个介绍人物很好的平台&#xff0c;很多的都想创造属于自己的百度百科。而人物百科词条&#xff0c;是百度百科专门为知名人物提供个人信息展示的平台。创建一个属于自己的百度百科词条&#xff0c;就相当于拥有了一张名片&#xff0c;不仅有着影响力与知名度的传播…

android c++ gizp 调用 so,使用ndk-build编译 android调用的so库

前沿编译so的方法有两种方法第一种就是编写原生的makefile文件利用gcc进行编译&#xff0c;这里我讲解的是另外一种。采用NDK提供的ndk-build编译。简介使用ndk编译的时候需要介绍它的脚本文件,Android.mk和Application.mk&#xff0c;但是Application.mk是可选的&#xff0c;用…

elctron项目_electron项目结构介绍

#项目结构my-project├─ .electron-vue(webpack配置文件)│ └─ build.js(生产环境构建代码)│ └─ dev-client.js(热加载相关)│ └─ dev-runner.js(开发环境启动入口)│ └─ webpack.main.config.js(主进程配置文件)│ └─ webpack.renderer.config.js(渲染进程配…

无法启动mysqll1006_CentOS7下MySQL服务启动失败原因及解决方法

在重启阿里的CentOS7服务器后,重启MySQL 出现错误Starting mysqld (via systemctl):Job for mysqld.service failed because the control process exited with error code.See "systemctl status mysqld.service" and "journalctl -xe" fordetails.[FAILED…

html5判断多选框是否选择的函数,复选框(checkbox)、多选框

1、需求分析可同时选中多个选项&#xff0c;实现全选、全不选、反选等功能。2、技术分析基础的HTML、CSS、JavaScript。3、详细分析3.1 HTML部分图示是一个列表加底部一段文字说明&#xff0c;列表包含三个部分&#xff0c;整体是一个多选列表&#xff0c;上部是总的选项&#…

layer调用父页面方法_Ruby for SketchUp之图层【Layer】

我们学习了群组、组件及组件定义&#xff0c;今天来看看图层【Layer】&#xff0c;在Sketchup2020版本中已经更名为“标记”&#xff0c;如图那么图层在我们建模过程中能带来哪些便利呢&#xff1f;可以快速的隐藏同一图层内所有东西&#xff0c;而不需要逐一选择并右键点击隐藏…

html盒子有哪些属性,盒子模型有哪些属性 在html5中哪些元素具有盒子模型

HTML盒模型基本属性有哪些CSS盒子模型就是在CSS技术所使用的一种思维模型。CSS假定所有的HTML文档元素都生成一个描述该元素在HTML文档布局中所占空间的矩形元素框&#xff0c;可以形象地将其看作是一个盒子。通过定义一系列与盒子相关的属性&#xff0c;可极大地丰富和促进各个…