常见的十大运算符

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)

例如:
⑴求~3

3的原码: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语言运算符-搜狗百科

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐