Hello,everbody!最近有些忙呀,断更了有一个星期了。之前落下了一些东西,最近正在整理。那好,废话不多说,让我们进入正题:【C语言】操作符优先级。
1.为什么要搞清楚操作符的优先级。
谈到操作符这个话题,正好戳中了很多宝子的痛点。因为C语言的操作符好像有很多,它们贯穿C语言学习的始终,所以显得很乱。也有些宝子觉得:只要我括号打得足够多,小小操作符能奈我何?哈哈哈,虽然括号确实能够解决此类问题。但是大家在平时的学习中有没有遇到这样的问题:当一个表达式比较长,其中各个变量的关系较复杂,括号又很多,大家有没有觉得读起来特别费劲?例如:if(sort((char*)arr+jwith,(char)arr+(j+1)*with)>0)这段代码是模拟实现qsort函数中的一个判断语句。我们想看懂它就比较困难了,并且这段代码没有多余的括号,所有的括号都是必要的。那大家在平时写代码的时候,括号很多的话会大大降低代码的可读性,今后在工作中也会造成不必要的麻烦。如果你追求卓越,写出高质量代码,那这篇文章会使你收获满满!当然,如果有宝子想要实现qsort函数的代码,我也给出来。今后我会具体讲讲这个函数是如何实现的。
2.操作符分类
下面我会按照操作符优先级从高到低的顺序依次列出,并逐个讲解。(下面级别没写结合顺序时,默认从左往右)在同一级中,我没有特别指明的优先级相同。
2.1 最高级
一共有四个,分别是:
1.圆括号:当我们要强制某些表达式提前运算时所加上的。例如:(a+b)*c.
2.下标运算符:C语言中,数组用到的尤其多。例如,我们要声明一个有十个元素,每个元素为int型的数组:
int arr[]={0,1,2,3,4,5,6,7,8,9};也可以这样写:int arr[10]={0,1,2,3,4,5,6,7,8,9};
3.指向结构体成员运算符:这个操作符往往要和结构体指针相结合。例如:
4.结构体成员运算符:这个就更加简单一些。
2.2 第二级
这一级是单目运算符,结合方向均为从右向左。
比如出现p++等价与(p++)。因此要想先解引用再自增需要打括号:(*p)++。
由于这些操作符大家都比较熟悉,我就不一 一赘述了。可能不太清楚的就是按位取反操作符~。这个操作符的运算比较复杂。需要我们从内存(计算机的原码,反码,补码)的角度去考虑。类似的还有按位与&,按位或|,按位异或^,左移运算符<<,右移运算符>>(其实都是按二进制位)。这些运算符虽然不常见,但在实现一些功能时却十分方便。例如百度曾经有一道面试题:要求不创建临时变量实现两个变量的交换。就用到了按位异或^。在这篇文章中,我们先了解它们。下篇文章,我会专门介绍数据的存储和按位操作符是怎么运算的。
2.3第三级
这一级都是算术运算符,结合顺序和数学学习中一致,是容易掌握的。先乘除取余再加减。
2.4第四级
这个运算符我会在下一篇文章中重点介绍!
2.5第五级
这些都是关系运算符。值得注意的是:< <= > >=的优先级要高于!=和==
2.6第六级
这些是按位运算符。优先级顺序:&>^>|
我会在下一篇文章着重讲解!
2.7第七级
逻辑与运算符:&&
逻辑或运算符:||
其中&&的优先级大于||
这两个运算符有个重要且易错的地方:在(表达式1)&&(表达式2)中若表达式1为假,则整个表达式返回假,表达式2不运算!如果表达式2中有自增运算,不会参与运算。 举个栗子:
我们可以看到,a>b不成立,计算机不会再去运算i++,而是直接返回假,i并没有自增。
同样的,逻辑或运算符也是如此。(表达式1)||(表达式2)中若表达式1为真,则整个表达式返回真,表达式2不运算!如果表达式2中有自增运算,不会参与运算。
2.8第八级
这是C语言中唯一一个三目运算符,结合顺序是从右往左。
2.9第九级
赋值运算符:=,+=,-=,/=,*=,%=,<<=,>>=,^=,&=,|=。结合顺序从右往左。
看来赋值运输符的优先级是非常低的。表达式a=b=c等价于b=c,a=b.
2.10最低级
, 逗号运算符,也称为顺序求知运算符。(表达式1,表达式2)先算表达式1,再算表达式2.最终的结果也是表达式2.例如:
当然,逗号运算符也可出现在数组中。举个栗子:
该程序中的二维数组等价于:int arr[2][2]={2,4,6,8};
3.结语
好啦,这次我们讨论了C语言运算符的分类,优先级,以及一些简单的讲解。希望大家能够有所收获。下一次,我会把C语言的数据存储,从内存的角度分析按位运算符的一些知识分享给大家。让各位宝子们知道平时那些程序中无意间出现的随机数与乱码是怎么来的!欢迎大家前来捧场!
当然,这篇文章如有表达不清晰或是逻辑错误的地方欢迎各位技术大佬前来指正!