在嵌入式Linux开发《C语言专题(三:运算符及优先级(1))》和嵌入式Linux开发《C语言专题(三:运算符及优先级(2))》文章中对C语言中常见的运算符和优先级作了介绍,这篇文章对运算符和优先级做整体总结。
C语言中的运算符有:算数运算符、关系运算符、逻辑运算符、赋值运算符、移位运算符、位运算符、单目运算符、条件运算符、逗号运算符。
先提几个概念:左值、右值、布尔值
左值:能够出现在赋值符号左边的东西,是个变量或者表达式比如int a[20] a[b+10]=0,b=10。
右值:只能够出现在赋值符号右边的东西,是一个值。
布尔值:0是假,任何非0都是真
(1)算数运算符:+(加)、 -(减)、 *(乘)、 /(除)、 %(取余),除了 %(取余)两边必须为整数外,其余的可以对整数或者浮点数进行计算操作。优先级比关系运算符高。
(2)关系运算符:>(大于)、>=(大于等于)、<(小于)、<=(小于等于)、!=(不等于)、==(等于),主要用于测试操作数之间的关系。通常用于if..else语句中。注意等号是用“==”来表示,而不是“=”(赋值)来表示。优先级比位运算符高。
(3)逻辑运算符:&&(逻辑与)、||(逻辑或) 其实还有!(逻辑取反,在后面的单目运算符中会介绍) 用于对负责的布尔表达式(表达式就是由运算符或者变量组成,比如a+b等)求值,测试它们的值是真还是假。注意与位运算符(&、|、^)的区别。&&(逻辑与)只有两边的操作数都为真时,结果才为真,||(逻辑或)只要有一边为真时结构就为真。“0与什么,结果为0,什么不进行计算求值;1或什么,结果为2,什么不进行计算求值”。优先级比条件运算符高。
(4)赋值运算符:= 它是用一个等号表示,还有复合赋值运算符:+=、-=、*=、/=、%=(这4种是结合算数运算符)、<<=、>>=(这2种是结合移位运算符)、&=、|=、^=(这3种是结合位运算符)。复合赋值运算符把运算结果的值(即右值)赋值为左操作数(左值)。优先级比逗号运算符高,比其它运算符低。
(5)移位运算符:<<(左移运算符)、>>(右移运算符)就是将一个值的每一位向左或者向右移动 移位操作时要注意是算数移位还是逻辑移位。两边的操作数都必须为整型。
(6)位运算符:&(位与)、|(位或)、^(位异或)对操作数的各个位进行位与、位或、位异或操作。两边的操作数都必须为整型,并按位进行位操作。这个在嵌入式编程中非常重要。优先级比逻辑运算符高。
(7)单目元素符:只有一个操作数的运算符。!(对操作数进行逻辑取反即:如果操作数为真,则结果为假,反之则为真;最终的结果只有0和1)、~(对整形操作数取反操作,比如原来为1的某一位,取反后为0,反之为1)、++(增值运算符)、--(减值预算符)、+(表示操作数为整数,加不加都可以)、-(表示操作数为负数)、&(表示操作数的地址)、*(间接访问运算符,与指针结合来访问指针所指向的值)、sizeof(以字节为单位计算操作符的类型长度,使用时可以加括号也可以不加)。优先级很高,比关算数运算符高。
(8)条件运算符:有3个操作数也即三目运算符 用法:表达式1?表达式2:表达式3 如果各个表达式比较复杂的话,为了清晰最好加上括号:((表达式1)?(表达式2):(表达式3))优先级比赋值运算符高。
(9)逗号运算符:用法:表达式1,表达式2,...将2个或者多个表达式用逗号分割开,表达式自左向右逐个取值,整个表达式的值就是最后那个表达式的值。优先级最低。
用代码测试一下,如下图所示:
运算符和优先级测试代码(1)
运算符和优先级测试代码(2)
优先级没有必要全部记住,用的多,自然就容易记住了。不过,常用的优先级最好能通过代码,理解记忆,方便自己阅读别人的代码。比如括号的优先级比较高,赋值运算符比较低,那么自己在写代码的时候能见括号就加括号,目的是使代码清晰,便于阅读。优先级排序:单目运算符>算数运算符>移位运算符>关系运算符>位运算符>逻辑运算符>条件运算符>赋值运算符>逗号运算符。对于同一优先级来说,要看结合性:是从左到右,还是从右到左。比如单目运算符、赋值运算符及条件运算符从右到左结合,其余运算符从左到右结合。其实除了以上的运算符外,还有一些高级的运算符比如[ ](数组下标)、.(成员选择对象)、->(成员选择指针)是数组和结构体中常用的符号,()圆括号是函数的标识等,只需要知道他们的优先级是最高的即可,在后面详细讲解。
一定要多用printf调试,加深自己的印象,看看结果是否和自己预料的一样,再去分析代码中的优先级以及结合性。