C语言基础入门(三)--运算符

197 阅读7分钟

1. 运算符

运算符是一种表示对数据进行何种操作处理的符号,每种运算符都有其功和运算规则。运算符主要有算术运算符、赋值运算符、自加自减运算符、关系运算符、逻辑运算符、位运算符以及其他运算符。

1.1 算术运算符

算术运算符主要有+、-、*、/、%五种。

运算符含义示例
+加法或取正值运算a + b, + 5
-减法或取负值运算a - b, - 3
*乘法运算x * y
/除法运算x / y
%取模运算(求余运算)5 % 3

1.2 赋值运算符

赋值运算符是“=”,其功能是先计算赋值运算符“=”右边表达式的值,并将其赋给“=”左边的变量。其一般形式为:

变量名 = 表达式

除了“=”这种简单的赋值运算符,还有复合的赋值运算符,在赋值运算符前加上算术运算符就构成了复合的赋值运算符,例如“+=”就是先进行加法运算后并将此值赋值给等式左边:

x += 5 就等于 x = x + 3。

运算符含义示例
=将右边的值赋值给左边a = 5
+=加法运算后的值赋给左边b += 3
-=减法运算后的值赋给左边b -= 3
*=乘法运算后的值赋给左边x *= 5
/=除法运算后的值赋给左边x /= 5
%=取模运算后的值赋给左边x %= 5

1.3 自加自减运算符

自加运算符“++”和自减运算符“--”的功能是使变量的值加1或减1,其优先级较高,但只能作用于简单变量。

运算符含义示例
++自增运算a++,++a
--自减运算b--,--b

注意: 自加(减)运算符有两种形式:

  • 前缀形式

即运算符置于变量的前面。如表达式++i、--i。它将变量达到值先加1或减1,然后用新的值参与表达式的运算。

  • 后缀形式

即运算符置于变量的后面。如表达式j++、j--。它会先用变量的值参与表达式的运算,运算完成后再将变量的值加1或减1.

1.4 关系运算符

关系运算符用来比较两个数据的大小,运算的结果只有两种: 真(1),假(0)

运算符含义示例结果
大于3 > 50
>=大于等于5 >= 31
<小于3 < 51
<=小于等于5 <= 30
==等于3 == 50
!=不等于3 != 51

1.5 逻辑运算符

逻辑运算符能处理更加复杂的条件判断,它的运算结果也只有两种:真(1),假(0)。

运算符含义示例结果
&&逻辑与3 && 5,2 && 01,0
||逻辑或2||0,0||01,0
逻辑非!2, !00,1

1.6 位运算符

位运算符号多用于硬件编程和网络地址的计算,他是将数据转换成二进制的格式下进行计算的,再将结果转换会原进制。

1.6.1 “按位与”运算符(&)

运算规则:参与运算的两个对象,按二进制位进行“与”运算。如果对应的二进制位都为1,则该位结果为1,否则为0。即:

  0 & 0 = 0        0 & 1 = 0        1 & 0 = 0        1 & 1 = 1

例如,3 & 6 的结果为2.

      0000 0011  (3)

 (&)  0000 0110  (6)
 -----------------------
      0000 0100  (2)

1.6.2 “按位或”运算符(|)

运算规则:参与运算的两个对象,按二进制位进行“或”运算。如果对应的二进制位都为0,则该位结果为0,否则为1。即:

  0 | 0 = 0        0 | 1 = 1        1 | 0 = 1        1 | 1 = 1

例如,3 | 6 的结果为7.

      0000 0011  (3)

 (|)  0000 0110  (6)
 -----------------------
      0000 0111  (7)

1.6.3 “按位异或”运算符(^)

运算规则:参与运算的两个对象,按二进制位进行“异或”运算。如果对应的二进制位相同时为0,不同时为1。即:

  0 ^ 0 = 0        0 ^ 1 = 1        1 ^ 0 = 1        1 ^ 1 = 0

例如,12 ^ 5 的结果为9.

      0000 1100  (12)

 (^)  0000 0101  (5)
 -----------------------
      0000 1001  (9)

1.6.4 “按位取反”运算符(~)

运算规则:(按位取反是一个单目运算符)参与运算为单个对象,用二进制位进行“取反”运算。当对应的二进制位为1,则该位结果为0,对应的二进制位为0,则该位结果为1。即:

  ~ 0 = 1       ~ 1 = 0

例如, ~ 13 的结果为242.

  (~) 0000 1101  (13)
 -----------------------
      1111 0010  (242)

注意:因为一个字节为8位,所以在取反运算时也要对8位都进行取反。

1.6.5 左移运算符(<<)

运算规则:用于将一个数的各个二进制位全部左移若干位,移出的高位均舍弃,低位则补0。

例如,3 << 2 的结果为12.

      0000 0011  (3)
 (<< 2) 
 -----------------------
      0000 1100  (12)

观察上面结果,发现左移2位,结果刚好比左移前大4倍,进而可以推出:将一个数左移n位,就相当于将该数乘以2^n次方(前提是没有发生“溢出”的情况)。

1.6.6 右移运算符(>>)

运算规则:用于将一个数的各个二进制位全部右移若干位,移出的低位均舍弃,高位一般补0(当该数为负数时,某些特殊情况会补1)。即:

例如,32 >> 2 的结果为8.

      0010 0000  (32)
 (>> 2)
 -----------------------
      0000 1000  (8)

观察上面结果,发现右移2位,结果刚好比右移前小4倍,进而可以推出:将一个数右移n位,就相当于将该数除以2^n次方(前提是没有发生“溢出”的情况)。

1.7 其他运算符

1.7.1 逗号运算符

逗号运算符“,”是所有运算符中优先级别最低的。逗号运算符用来连接表达式。即:

    表达式1,表达式2。

先求表达式1的值,再求表达式2的值,表达式2决定最终的值。

例如,设 a = 2 ,则 a *= a + 4,a * 4的求解过程为:

  • 先求 a *= a + 4,得 a 的值为21。

  • 再求 a * 4,得 a = 84。

故a的最终值为84。

1.7.2 条件运算符

条件运算符是C语言中唯一的三目运算符,由“?”和“:”两个运算符组成。其一般表达式为:

    表达式1 ? 表达式2 : 表达式3

运算顺序为:先计算表达式1的值,若为真(非0),则计算表达式2的值,并将其作为整个表达式的值;如若表达式1的值为假(0),则计算表达式3的值,并将其作为整个表达式的值。

例如,求两个数中的更大的值

max = ( ( a > b ) ? a : b );

当 a > b 时,会将变量 a 的值赋给 max ;反之,会将 b 的值赋给 max 。

1.7.3 sizeof运算符

sizeof是一个比较特殊的单目运算符,用来求得一种数据在内存中占多少个存储单元(字节),其一般使用形式为:

  sizeof(变量或数据类型)

例如,计算一个整型变量所占内存:

int a = 1000;

printf("%d",sizeof(a));

运行结果是4,一个整型int变量占4个字节。

1.8 常用运算符优先顺序

在一个表达式中,运算符优先顺序高的运算会优先计算,下面介绍常用的运算符优先顺序

1级优先:

运算符名称使用形式
( )圆括号(表达式)/函数名(形参表)
[ ]数组下标数组名 [ 常量表达式 ]
.成员选择(对象)对象 . 成员名
->成员选择(指针)对象 -> 指针成员名

2级优先:

运算符名称使用形式
+/-正负号运算符±表达式
++/--自增减运算符++变量名 / 变量名--
*取值运算符*指针变量
!逻辑非运算符&变量名
&取地址运算符!表达式
~按位取反运算符~表达式
sizeof长度运算符sizeof(表达式)

3级优先:

运算符名称使用形式
*3 * 5
/4 / 3
%取模5 % 2

4级优先:

运算符名称使用形式
+3 + 8
-6 - 3

5级优先:

运算符名称使用形式
<<左移13 << 2
>>右移65 >> 3

6级优先:

运算符名称使用形式
大于表达式 > 表达式
>=大于等于表达式 >= 表达式
<小于表达式 < 表达式
<=小于等于表达式 <= 表达式

7级优先:

运算符名称使用形式
==等于表达式 == 表达式
!=不等于表达式 ! = 表达式

8级优先:

运算符名称使用形式
&按位与表达式 & 表达式
按位异或表达式 ^ 表达式
按位或表达式 | 表达式
||逻辑或表达式 || 表达式
&&逻辑与表达式 && 表达式

9级优先:

运算符名称使用形式
? :条件运算符表达式 ? 表达式 : 表达式

10级优先:

运算符名称使用形式
=赋值运算符变量 = 表达式
+=加后赋值变量 += 表达式
-=减后赋值变量 -= 表达式
/=除后赋值变量 /= 表达式
*=乘后赋值变量 *= 表达式
%=取模后赋值变量 %= 表达式

11级优先:

运算符名称使用形式
,逗号运算符表达式 , 表达式