
常见的十大运算符及其优先级
常见的十大运算符
1.算术运算符
算术运算符用于各类数值运算。包括以下七种:
加(+)、减(-)、乘(*)、除(/)、求余(或称模运算,%)、自增(++)、自减(–)
2.关系运算符
关系运算符用于比较运算。包括以下六种:
大于(>)、小于(<)、等于(==)、 大于等于(>=)、小于等于(<=)、不等于(!=)
相同优先级运算符,从左至右依次运算。注意后缀运算优先级高于前缀。
因此 ++i++ 应解释为 ++(i++)
3.逻辑运算符
逻辑运算符用于逻辑运算。包括以下三种:
与(&&)、或(||)、非(!)
与或非的运算优先级不一样
因此 a && b || b && c 解释为 (a && b) || (b && c)
4.位操作运算符
位操作运算符参与运算的量,按二进制位进行运算。包括以下六种:
位与(&)、位或(|)、位非(~)、位异或(^)、左移(<<)、右移(>>)
4.1 按位与运算符(&)
参加运算的两个数据,按二进制位进行“与”运算。
运算规则:0&0=0; 0&1=0; 1&0=0; 1&1=1;
即:两位同时为1,结果才为1,否则为0
4.2 按位或运算符(|)
参加运算的两个数据,按二进制进行“或”操作。
运算规则:0|0=0; 0|1=1; 1|0=1; 1|1=1;
即 :参加运算的两个对象只要有一个为1,其值为1。
4.3 按位非运算符(~)
因为计算机底层都是以补码进行计算的,故以补码的方式进行的,转二进制后取反。
按位非操作就是操作数的负值-1,即~x=x*(-1)-1=-(x+1)。
运算规则:转二进制补码,取反(即0变1, 1变0)
例如:
⑴求~33的原码:0000 0011(第一个是符号位,0表示+,1表示-)
计算机里面存的3的样子: 3的补码:0000 0011(由于3是正数,正数的原码补码反码都是一样的)
则~3在计算机中的形式为: ~3的补码:1111 1100(就是把3的补码所有位数全部取反)
~3的反码:1111 1011(补码=反码+1)
~3的原码:1000 0100(符号位为1,不变,其他位取反,即-4)⑵求~-7
-7的原码:1000 0111(第一个是符号位,0表示+,1表示-)
-7的反码:1111 1000(由于-7是负数,反码需要取反)
计算机里面存的-7的样子:-7的补码:1111 1001(补码=反码+1)
则~-7在计算机中的形式为: ~-7的补码:0000 0110(把-7的补码所有位数全部取反)
~-7的原码:0000 0110(补码符号位为0,正数的原码=反码=补码,即6)
4.4 按位异或运算符(^)
参加运算的两个数据,按二进制位进行“异或”运算。
运算规则:0^0=0; 0^1=1; 1^0=1; 1^1=0;
即:参加运算的两个对象,如果两个相对应位的值不同,则该位结果为1,否则为0。
4.4 左移运算符(<<)
将一个运算对象的各二进制位全部左移若干位(左边的二进制位丢弃,右边补0)。
4.4 右移运算符(>>)
将一个数的各二进制位全部右移若干位,正数左补0,负数左补1,右边丢弃。
5.赋值运算符
赋值运算符用于赋值运算,分为以下三类,共十一种。
简单赋值(=)
复合算术赋值(+=,-=,*=,/=,%=)
复合位运算赋值(&=,|=,^=,>>=,<<=)
6.条件运算符
条件运算符这是一个三目运算符,用于条件求值( ? : )
条件运算符优先级高于赋值、逗号运算符,低于其他运算符
例如:
⑴ m<n ? x : a+3
等价于:(m<n) ?(x) :(a+3)
⑵ a++>=10 && b–>20 ? a : b
等价于:(a++>=10 && b–>20) ? a : b
⑶ x=3+a>5 ? 100 : 200
等价于:x= (( 3+a>5 ) ? 100 : 200 )
7.逗号运算符
逗号运算符用于把若干表达式组合成一个表达式( , )
C 语言中,逗号(,)也可以是运算符,称为逗号运算符(Comma Operator)。逗号运算符可以把两个以上(包含两个)的表达式连接成一个表达式,称为逗号表达式。其一般形式为:
子表达式1, 子表达式2, …, 子表达式n
8.指针运算符
指针运算符用于取内容(*)和取地址(&)二种运算。
&:取地址运算符,它返回运算对象的内存地址。
*: 指针运算符,也称为“间接引用操作符”,它返回指针指的变量的值。
⑴取地址运算符 &
& 是一元运算符,返回操作数的内存地址。如果操作数 x 的类型为 T,则表达式 &x 的类型是 T 类型指针(指向 T 的指针)。
取址运算符的操作数必须是在内存中可寻址到的地址。换句话说,该运算符只能用于函数或对象(例如左值),而不可以用于位字段,以及那些还未被存储类修饰符register声明的内容。
当需要初始化指针,以指向某些对象或函数时,需要获得这些对象或函数的地址。
> float x, *ptr;
> ptr = &x; // 合法:使得指针ptr指向x
> ptr = &(x+1); // 错误: (x+1)不是一个左值
⑵指针运算符*
相反地,当已具有一个指针,并且希望获取它所引用的对象时,使用间接运算符 *(indirection operator),有时候这会被称为解引用运算符(dereferencing operator)。它的操作数必须是指针类型。如果 ptr 是指针,那么 *ptr 就是 ptr 所指向的对象或函数。如果 ptr 是一个对象指针,那么 ptr就是一个左值,可以把它(即ptr)当作赋值运算符左边的操作数。
> float x,*ptr=&x;
> *ptr=1.7;// 将1.7赋值给变量x
> ++(*ptr);// 并将变量x的值加1 ,ptr的值不变
在这个示例最后的语句中,ptr 的值保持不变,但 x 的值变成 2.7。 如果指针操作数的值不是某个对象或函数的地址,则间接运算符*的操作结果无法确定。
像其他一元操作数一样,运算符 & 和 * 具有很高的优先级。操作数的组合方式是从右到左。因此,表达式 ++(*ptr)中的括号是没有必要的。
9.求字节数运算符
求字节数运算符用于计算数据类型所占的字节数(sizeof)。
sizeof是c语言的一种单目操作符,如c语言的其他操作符++、–等。并且它并不是一个函数,sizeof的操作符以字节的形式给出了操作数的储存大小(操作数可以是一个表达式或括号里的类型名)并其储存的大小有操作数的类型决定,和本身无关系。
⑴用于数据类型
sizeof的使用形式:sizeof(char)
注意数据类型必须用括号。
⑵用于变量
sizeof使用形式:sizeof(a)或者sizeof a都是正确的形式,但是大多的人都会带上括号。
sizeof的操作符不能用于函数类型,不完全类型。不完全类型是指具有未知储存大小的数据类型,如未知储存大小的数组类型、未知内容的结构或联合类void类型。
10.特殊运算符
特殊运算符有括号(),下标[],指向运算符(->)与 成员运算符(.)等几种。
运算符优先级
基本表达式1级
基本表达式(Primary expressions),主要是用于运算符之间,做为运算数。
标识,常量,字符串文字量,优先级提升表达式最优先执行。
优先级提升表达式是指圆括号包围的表达式,如“( expression )”
后缀表达式2级
postfix-expression [ expression ],数组下标运算。
postfix-expression ( argument-expression-list),函数调用,括号内的参数可选。
postfix-expression . identifier,成员访问,
postfix-expression -> identifier,成员访问,->号之前应为指针。
postfix-expression ++,后缀自增
postfix-expression --,后缀自减
( type-name ) { initializer-list }
( type-name ) { initializer-list , } 复合初始化,C99后新增。例如
单目一元运算3级
++ unary-expression 前缀自增
– unary-expression 前缀自减
unary-operator cast-expression 单目转型表达式, 包括 取地址& ,提领 * , 正号+ ,负号- 位反~ 逻辑否!。
sizeof unary-expression 求类型长度,对表达式求类型长度
sizeof ( type-name ) 求类型长度
强制类型表达式4级
( type-name ) cast-expression,强制表达式成为type-name指定的类型。
乘法表达式5级
“ * ” 乘法运算符;“ / ”除法运算符;“ % ” 取余运算符。
加法运算符6级
“ + ”加法运算符;“ - ”减法运算符。
移位运算符7级
<< 左移运算符;>> 右移运算符。
关系运算符8级
<、<=、>、>=关系运算符。
相等运算符9级
“ == ”等于运算符;“ != ”不等于运算符。
位与运算符10级
“ & ”按位与运算符
位异或运算符11级
“ ∧ ”按位异或运算符(Bitwise exclusive OR operator)。
位或运算符12级
“ | ”按位或运算符(Bitwise inclusive OR operator)。
逻辑与运算符13级
“&&”逻辑与运算符。
逻辑或运算符14级
“ || ”逻辑或运算符。
三元条件运算符15级
? :条件运算符。
赋值运算符16级
=、 +=、 -=、 *=、 /=、 %=、 &=、 ^=、 |=、 <<=、 >>=赋值运算符。
逗号运算符17级
“,”逗号运算符。
链接: C语言运算符-搜狗百科
更多推荐








所有评论(0)