优先级和结合性

加入嵌入式技术QQ群:398294860,免费获取嵌入式技术文档,嵌入式最新学习路线指南,更多嵌入式教程,访问宅学部落淘宝店:https://wanglitao.taobao.com/

我们学习四则运算时,都知道先算乘除,后算加减,当一个算式中同时有乘除时,谁在前面先算谁。C语言也是如此,当一个表达式含有多个运算符时,先算哪个,后算哪个?就要根据运算符的优先级来判断了。比如表达式1+2*6,因为乘法的优先级高级加法,所以要先算乘法2*6,这里还涉及运算符的“目数”问题,一个乘法运算符*需要两个乘数参与运算,所以“*”是双目运算符,所以会先运算2*3这个表达式。加法和乘法一样,也是双目运算符,所以接下里计算加法时,会执行1+12这样的表达式,最后得出表达式的结果为13。

在C语言中,并不是所有的运算符都是双目运算符。比如取反运算符~,用来对一个数进行取反操作,它只需要一个操作数,所以是单目运算符。类似的单目运算符还有符号(-)、自增运算符(++)、自减运算符(—)等。

在一个表达式中,当遇到两个优先级相同的运算符时,比如表达式:1+2*6/3,到底是先算2*6呢?还是先算6/3呢?这个就要靠运算符的结合性来判断了。

结合性

在C语言中,一个运算符不光有优先级,还有结合性。当在一个表达式中遇到相同优先级的运算符,我们需要使用结合性来判断哪个运算符先执行。结合性分为左结合性和右结合性,在C语言标准中并没有给结合性一个准确的解释,我们简单点理解,可以这样认为:运算符的左结合性是指当一个表达式出现相同优先级的运算符时,最左边的运算符先执行,从左往右依次执行;而右结合性则是从右往左依次执行。

在C语言中,乘号和除号都是左结合性,所以在表达式1+2*6/3中,会先算乘法,运算符*是双目运算符,需要两个操作数,所以会先运算2*6,得出结果后,再计算12/3,最后再计算1+4,最后表达式的值为5。

在下面的程序中,a的值会是多少呢?是10?还是20?

int a;
int b=10;
int c=20;
a = b = c;

在赋值表达式a=b=c中,到底是先算a=b,还是先算b=c?这也得从赋值运算符“=”的结合性说起。赋值运算符“=”是右结合性,在表达式中存在相同的2个赋值运算符,所以要先算最右边的赋值运算符,赋值运算符时双目运算符,所以会先算表达式b=c, 这个表达式计算结束后,表达式的值即为b的值,为20。接下来计算a=20这个表达式,计算结束后,a的值为20。

结合性是为了解决一个表达式中同级运算符的先后计算顺序问题。所以在下面的表格中我们可以看到,具有相同优先级的运算符,它们的结合性都是一样的,否则就无法解决先后计算顺序的问题了。

在C语言中,绝大多数运算符的结合性都是左结合。只有三种运算符除外:单目运算符、条件运算符和赋值运算符,大家只要记住这三种右结合性的运算符就可以了,其余的全部是左结合性运算符。

专门为嵌入式设计的C语言进阶视频教程:《C语言嵌入式Linux高级编程》,一共9期,涉及计算机体系结构、ARM汇编与反汇编、程序的编译链接原理、堆栈内存、Linux内核的面向对象编程思想、多任务编程、C语言的模块化编程等专题,具体课程详情可点击淘宝:C语言嵌入式Linux高级编程