操作符详解


  之前为了说明变量的存储方式和运算过程,将 (!~)单独举例进行了说明,这里再对其他的一些操作符作一些补充。不变的原则是,C语言中 整数的运算以变量补码的方式进行。

1.操作符的优先级

1.1 优先级列表

  下标列出了C 运算符的优先级和结合性。运算符优先等级按降序从上到下列出。

优先级操作符描述结合性
1++ --Suffix/postfix(后缀)递增和递减左到右
()函数调用
[]数组下标
.结构和联合成员访问
->通过指针访问结构体和联合体成员
(type){list}复合字面量(C99)
2++ --前缀递增和递减右到左
+ -一元加减
! ~逻辑非和按位取反
(type)类型转换
*解引用
&取地址
sizeof变量的尺寸
_Alignof对齐要求(C11)
3* / %乘法、除法和余数左到右
4+ -加减
5<< >>按位左移和右移
6< <=关系运算符 < 和 ≤
> >=关系运算符 > 和 ≥
7== !=关系运算符 = 和 ≠
8&按位与
9^按位异或(异或)
10|按位或
11&&逻辑与
12||逻辑或
13?:三元条件右到左
14 =简单赋值
+= -=按和、差赋值
*= /= %=按乘积、商和余数赋值
<<= >>=按位左移和按位右移赋值
&= ^= |=按位 与、异或 和 或 赋值
15,逗号左到右

1.2 注释

  • 前缀的++和-- 不能作用于强制类型转换的操作数。
    在这里插入图片描述

  • 表达式sizeof (int) * p被解释为(sizeof(int)) * p,而不是sizeof((int)*p)
    在这里插入图片描述

  • 在三元条件?: 内添加表达式,表达式默认添加了括号。

  • 对于结合性的理解:a = b = c, 表格内说从右向左,即 a = ( b = c ),右边的赋值先执行。

  另外:C语言标准没有指定优先级,他们来自语法。还要注意不要写过于复杂的表达式,不要给人挖坑也不要为难自己。

2 操作符举例

2.1 / 和%

  / 表示 除法,可以用于整数和浮点数运算,当表示整数除法时,结果等于被整除的部分;而% 表示取余操作,只能用于整数的运算。
在这里插入图片描述

2.2 >>和<<

  >>表示二进制补码按位右移,<<表示二进制补码按位左移。实现这个部分的单元被称为移位寄存器,如下:
在这里插入图片描述
  移位运算有循环移位(高位移出补到低位;低位移出补到高位)、逻辑移位(移出的位丢弃,空缺位补0)、算数移位(移除位丢弃,空缺位用符号位填充),具体实现什么样的移位过程,由计算机的控制指令决定,而具体给什么指令,则由编译器编译决定,只要C语言没给出标准,编译器可以自行决定控制器的指令。

在VS2015中:

  • 对于无符号数(unsigned),只执行逻辑移位

  • 对于有符号数(signed):

    • 左移:逻辑移位
    • 右移:算数移位

在这里插入图片描述

2.3 ^

  关于异或操作符^,表示两个二进制数对应位,相异为1,相同为0
这里再对二进制位的运算做一个复习。
在这里插入图片描述
  另外对于^使用有个小技巧:用于整型变量的交换
在这里插入图片描述

2.4 sizeof

  sizeof用来计算内存空间的大小(单位byte),它属于操作符,不是函数。另外要注意的是,sizeof中的表达式不参与计算,原因是在预编译时,sizeof() 整个就被替换成了4(如下),a++后面不再出现了。
在这里插入图片描述

2.5 && 和 ||

  逻辑与逻辑或,他们的运算结果只表示真假。有关它们的一个细节是,当赋值操作多变量时,对于&&只要有往后都不执行了;对于||只要有往后都不执行了。
在这里插入图片描述

参考资料

[1]: 《C Operator Precedence》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值