第三章 C语言之运算符
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 | , | 逗号运算符 | 从左到右 |
阅读剩余
版权声明:
作者:hywing
链接:https://iotstuff.cn/c-operator/
文章版权归作者所有,未经允许请勿转载。
THE END