第三章 C语言之运算符

3.运算符

3.1 算术运算符

算术运算符用于执行加减乘除等数学运算

 int a = 10 + 3; // 加法
 int b = 10 - 4; // 减法
 int c = a * b;  // 乘法
 int d = a / b;  // 除法

常见的算术运算符有+、-、*、/、%、++、--等

算符 描述 演示 含义
+ 加法 a + b a加b
- 减法 a - b a减b
* 乘法 a * b a乘b
/ 除法 a / b a除b
% 取余 a % b 求a整除b的余数
++ 自增 a++ a自加1
-- 自减 a-- a自减1

3.2 关系运算符

关系运算符用于比较两个数据直接的大小关系,常见的关系运算符有

运算符 描述 演示 含义
> 大于 a > b a大于b
>= 大于等于 a >= b a大于等于b
< 小于 a < b a小于b
<= 小于等于 a <= b a小于等于b
== 等于 a == b a等于b
!= 不等于 a != b a不等于b

3.3 逻辑运算符

逻辑运算符用于得出数据之间的真假逻辑关系,常见的逻辑运算符有

运算符 描述 演示 含义
&& a && b a与b
|| a || b a或b
! !a a的非值

3.4 位运算符

位运算符用于对数据二进制位序列进行运算,只有整型数据能够进行位运算,常见的位运算符有

运算符 描述 演示 含义
& 各位与 a & b a跟b各位与
| 各位或 a | b a跟b各位或
~ 各位取反 ~a a各位取反
^ 各位异或 a ^ b a跟b各位异或
<< 各位左移 a << b a左移b位
>> 各位右移 a >> b a右移b位

位运算符操作代码演示

 int a = 0b1001;
 int b = 0b1110;
 a & b   // 8 :1000
 a | b   // 15:1111
 ~a      // 6: 0110
 a ^ b   // 7: 0111
 a << 1  // 18:10010
 a >> 1  // 4: 100

二进制位运算真值表

a b a & b a | b a ^ b ~a a << 1 a >> 1
0 0 0 0 0 1 0 0
0 1 0 1 1 1 0 0
1 0 0 1 1 0 2 0
1 1 1 1 0 0 2 0

3.6 赋值运算符

赋值运算符一般用于变量的赋值,常见的赋值运算符有

运算符 描述 演示 含义
= 赋值 a = b b赋值给a
+= 先加再赋值 a += b a先加b再赋值a
-= 先减再赋值 a -= b a先减b再赋值a
*= 先乘再赋值 a *= b a先乘b再赋值a
/= 先除再赋值 a /= b a先除b再赋值a
%= 先取余再赋值 a %= b a先跟b取余再赋值a
&= 先按位与再赋值 a &= b a先跟b按位与再赋值a
|= 先按位或再赋值 a |= b a先跟b按位或再赋值a
^= 先按位异或再赋值 a ^= b a先跟b按位异或再赋值a
<<= 先按位左移再赋值 a <<= b a先按位左移b位再赋值a
>>= 先按位右移再赋值 a >>= b a先按位右移b位再赋值a

3.7 条件运算符

条件运算符跟if ... else ...语句的效果类似,用于执行条件判断,格式是condition ? a : b

 int a = 13;
 int b = 20;
 printf("%d\n", a > b ? (a + b) : (a - b));

3.8 其他运算符

sizeof,求表达式或数据类型占用内存大小

 printf("size of int : %d\n", sizeof(int));
 printf("size of float number : %d\n", sizeof(3.1415926));

*,取指针指向的数据

 int val = 100;
 int *p = &val;
 printf("val : %d\n", *p);

.和->,取结构体成员,一个是取结构体类型成员,一个是取结构体指针类型成员

 struct Demo
 {
     int a;
     int b;
 }demo;
 
 void func()
 {
     demo.a = 100;
     demo.b = 10;
     struct Demo *p = &demo;
     printf("a = %d, b = %d\n", p->a, p->b);
 }

3.9 优先级及结合性

表达式里边有不同优先级的运算符,先进行高优先级的运算,再进行低优先级运算;当遇到相同优先级的运算符的时候,需要一个规则来确定运算的顺序,这个规则就是结合性,C语言大部分运算符的结合性都是从左到右,只有少部分如条件运算符是从右到左

优先级 运算符 描述 结合性
1 ++-- () [] . -> (type){list} 后缀自增和自减 函数调用 数组下标运算 结构体取成员 结构体指针取成员 表达式结果转换 从左到右
2 ++-- +- !~ (type) * & sizeof _Alignof 前缀自增和自减 正负符号 逻辑非 按位取反 强制类型转换 地址取址 取变量地址 取变量或者类型长度 数据对齐 从右到左
3 */% 乘 除 取余 从左到右
4 +- 加 减 从左到右
5 <<>> 位左移 右移 从左到右
6 <<= >>= 小于 小于等于 大于 大于等于 从左到右
7 ==!= 等于 不等于 从左到右
8 & 按位与 从左到右
9 ^ 按位异或 从左到右
10 | 按位或 从左到右
11 && 逻辑与 从左到右
12 || 逻辑或 从左到右
13 ?: 条件运算符 从右到左
14 = += -= *= /= %= <<= >>= &= ^= 赋值 先加后赋值 先减后赋值 先乘后赋值 先除后赋值 先取余后赋值 先左移后赋值 先右移后赋值 先按位与后赋值 先异或后赋值 从右到左
15 , 逗号运算符 从左到右
阅读剩余
THE END