1.算术运算符
注意:%是算术运算的重点,一般运用在将某个数值控制在一定范围内
2.单目运算(前后缀运算)
1.
前缀自加自减运算:先进行自加自减,再参与表达式运算
2.
后缀自加自减运算:先参与表达式运算,在进行自加自减
例如:
int a = 10;
int b = 20;
int c = ++a; // a先自加1,变成11;然后再赋值给c,因此c等于11
int d = b++; // b先赋值给d,因此d等于20,然后b自加1,变成21
int e = --a; // a先自加1,变成11;然后再赋值给e
int f = b--; // b先赋值给f,然后b自加1
3.关系运算符
注意:
关系运算符用于判断运算符两边的表达式是否满足给定的大小条件
由关系运算符组成的表达式称为关系表达式,其值为布尔型
如果关系成立 true 1
如果关系不成立 false 0
判断是否相等是双等号 ==,而不是一个等号
4.逻辑运算符(对整个变量进行操作)
运算规则:
逻辑反:将逻辑真、假翻转,即真变假,假变真
逻辑与:将两个关系表达式串联起来,当且仅当左右两个表达式都为真时,结果为真。
逻辑或:将两个关系表达式并联起来,当且仅当左右两个表达式都为假时,结果为假。
特殊规则:C语言是一种惰性语言
在逻辑与运算中,如果左边表达式的值为假,那么右边表达式将不被执行。
在逻辑或运算中,如果左边表达式的值为真,那么右边表达式将不被执行。
5.位运算符(重点)
对整个变量的某一位进行操作
单片机寄存器中、数据处理(bmp图像处理)
运算符 | 名称 | 举例 | 功能说明 |
~ | 位逻辑反 | ~a | 将变量中的每一位取反 |
& | 位逻辑与 | a&b | 将变量a和b逐位进行与操作 |
| | 位逻辑或 | a|b | 将变量a和b逐位进行或操作 |
^ | 位逻辑异或 | a^b | 将变量a和b逐位进行异或操作 |
<< | 左移 | a<<4 | 将变量中a中的每一位向左移动4位 |
>> | 右移 | b>>3 | 将变量中b中的每一位向右移动3位 |
将每一个变量转换成二进制后再按位取反
位运算符操作的对象是数据中的每一位
运算规则:
位逻辑反、位逻辑与、位逻辑或拥有与逻辑运算相似的规则和一样的真值表。
异或运算:相同为0,不同为1
移位运算:移出去的不要,空出来的补零。移位运算都是针对无符号数的运算。
~:按位取反---单目运算,数据将每一个bit位进行取反,1变0,0变1
&:按位与,两个都为1,结果才为1
| : 按位或,两个都为0,结果才为0
^ : 按位异或操作,不同为1,相同为0
<< : 左移,按位往左移动
无符号左移(重点)
往左移动,移出的丢弃,空出的补零,对无符号左移,移动n位就乘以
2
的
n
次方
有符号左移
1.
将负数的原码转为补码
2.
将补码进行左移
3.
将左移后的补码再转为原码
>>:右移操作
无符号右移
往右移动,移出的丢弃,空出的补零
对无符号右移,移动n
位就除以
2
的
n
次方
有符号右移
1.
将负数的原码转为补码
2.
将补码进行右移
,
空出来的补符号位
(
linux
系统
)
3.
将右移后的补码再转为原码
6.特殊运算符
1.赋值运算符 =
如果有赋值语句 X=10
;则其表示的含义为:将变量
y
的内容赋值给变量
X的地址所对应的那块内存。
如果有赋值语句
X=10
;则其表示的含义为:将常量
10
的值赋值给变量X
的地址所对应的那块内存。
这就是为什么 变量的地址被称为 左值(
lvalue
),而其内容又被称为右值(rvalue
)的原因。
注意:
不能对常量赋值
只能对变量赋值
不能对数组赋值
可以连续赋值,从右往左
int a, b;
int x[5];
a = 100; // 对变量 a 赋值,正确
b = a; // 对变量 a 赋值,正确
3 = 100; // 对常量 3 赋值,错误!
x = 123; // 对数组 b 赋值,错误!
a + 3 = 200; //只能对变量赋值,错误!
// 连续赋值
a = b = 50; // 先将 50 赋给 b,再将 b 的值赋给 a,正确33
2.复合赋值符
当左右两边有相同的操作数时,采用复合赋值符不仅直观,且能提高运算效率
除了下述
10
个复合运算符之外,生造别的复合运算符是非法的
// 加减乘除:
a += n; // 等价于 a = a+n;
a -= n; // 等价于 a = a-n;
a *= n; // 等价于 a = a*n;
a /= n; // 等价于 a = a/n;
// 求余:
a %= n; // 等价于 a = a%n;
// 位运算:
a &= n; // 等价于 a = a&n;
a |= n; // 等价于 a = a|n;
a ^= n; // 等价于 a = a^n;
a >>= n; // 等价于 a = a>>n;
a <<= n; // 等价于 a = a<<n;
a **= 2; //不合法
3.内存取址符
7.条件运算符(三目运算符)
唯一需要三个操作数的运算符(相当于一个 if.......else...... 语句)
语法:表达式1?表达式2:表达式3
释义:当表达式1为真时,去表达式2,否则取表达式3
8.sizeof 运算符
含义:计算指定数据类型或者变量所占据内存的字节数(不是函数)
语法:sizeof(类型)、sizeof(变量),计算变量的字节数时圆括号可以省略
例:
printf("%d\n", sizeof(int));
printf("%d\n", sizeof(long double));
int a[5];
printf("%d\n", sizeof(a));
printf("%d\n", sizeof a);
9.return运算符
含义:退出某个函数(如果退出的是主函数main,那么整个程序也就推出)
语法:必须出现在函数体内,可以带函数对应类型的数据
主函数的return 0表示正常退出程序,非0异常退出程序
例:
10.逗号运算符表达式
(表达式1,表达式2,表达式3,.... 表达式n)
求值顺序:
先求表达式1,再求表达式2,再求表达式3,最后求表达式n
整个逗号表达式的值为表达式n的值
注意:
逗号表达式的优先级最低
运算顺序是从左往右
整个表达式的值为表达式最右边的值
10.优先级与结合性
当表达式出现不同的运算符时,根据优先级来决定谁先执行,比如先乘除后加减
当表达式中出现多个相同优先级的运算符时,更具结合性决定谁先运行,比如从左到右
注意:
虽然我们可以根据优先级和结合性,来表示复杂的表达式,但是这种做法是不推荐的,当我们需要用到比较复杂的表达式时。
1
、我们可以考虑拆分,使之不要太长,难以看清表达式分量的逻辑关系。
2
、如果不得已要使用复杂表达式,则推荐使用圆括号将需要先计算的表达式括起来。