1.算数运算符
运算符 |
功能说明 |
举例 |
+ |
加法,一目取正 |
a+b |
- |
减法,一目取负 |
a-b |
* |
乘法 |
a*b |
/ |
除法 |
a/b |
% |
取模(求余) |
a%b |
++ |
自加1 |
a++, ++b |
– |
自减1 |
a–, --b |
- 关注点:
- 减号也是负号,比如 -a 是取变量 a 的相反数。
- 取模运算要求左右两边操作数必须是整型数据。
- 自加和自减运算不仅可以对整型操作,也可以对浮点数、指针操作。
- 前后缀运算:
a.前缀自加自减运算:先进行自加自减,再参与表达式运算
b.后缀自加自减运算:先参与表达式运算,在进行自加自减
int a = 100;
int b = 200;
int c = ++a; // a先自加1,变成101;然后再赋值给c,因此c等于101
int d = b++; // b先赋值给d,因此d等于200;然后b自加1,变成201
2.关系运算符
运算符 |
功能 |
举例 |
说明 |
> |
大于 |
a > b |
判断a是否大于b |
>= |
大于或等于 |
a >= 5 |
判断a是否大于或等于5 |
小于 |
3 < x |
判断3是否小于x | |
小于或等于 |
x |
判断x是否小于或等于y+1 | |
== |
等于 |
(x+1) == 0 |
判断x+1是否等于0 |
!= |
不等于 |
c != ‘\0’ |
判断c是否不等于’\0’ |
- 关注点:
- 关系运算符用于判断运算符两边的表达式是否满足给定的大小条件。
- 由关系运算符组成的表达式称为关系表达式,其值为布尔型。
- 判断是否相等是双等号==,而不是一个等号。
3.逻辑运算符
运算符 |
功能说明 |
举例 |
! |
逻辑反 |
!(x==0) |
&& |
逻辑与 |
x>0 && x |
|| |
逻辑或 |
y10 |
- 运算规则:
- 逻辑反:将逻辑真、假翻转,即真变假,假变真。
- 逻辑与:将两个关系表达式串联起来,当且仅当左右两个表达式都为真时,结果为真。
- 逻辑或:将两个关系表达式并联起来,当且仅当左右两个表达式都为假时,结果为假。
- 特殊规则:
- 在逻辑与运算中,如果左边表达式的值为假,那么右边表达式将不被执行。
- 在逻辑或运算中,如果左边表达式的值为真,那么右边表达式将不被执行。
4.位运算符
运算符 |
名称 |
举例 |
功能说明 |
~ |
位逻辑反 |
~a |
将变量 a 中的每一位取反 |
& |
位逻辑与 |
a & b |
将变量 a 和 b 逐位进行与操作 |
| |
位逻辑或 |
a | b |
将变量 a 和 b 逐位进行或操作 |
^ |
位逻辑异或 |
a ^ b |
将变量 a 和 b 逐位进行异或操作 |
<< |
左移 |
a<<4 |
将变量 a 中的每一位向左移动4位 |
>> |
右移 |
x >> n |
将变量 x 中的每一位向右移动4位 |
- 位运算符操作的对象是数据中的每一位
- 运算规则:
- 位逻辑反、位逻辑与、位逻辑或拥有与逻辑运算相似的规则和一样的真值表
- 异或运算:相同为0,不同为1
- 移位运算:移出去的不要,空出来的补零。移位运算都是针对无符号数的运算。
左移运算
右移运算
「课堂练习4」
问题1:
假设有如下程序,程序输出的结果是什么?
int main(void)
{
unsigned char a, b, c;
a = 0x3;
b = a|0x8;
c = b<<1;
printf("%d%d\n", b, c);
}
问题2:
假设有一个无符号32位整型数据
unsigned int data=0x12ff0045
请编写一个程序用位运算把data的第14、15位修改1,把22、23位修改为0, 并且输出修改后的数据。
5.特殊运算符
- 赋值运算符
- 不能对常量赋值,只能对变量赋值
- 不能对数组赋值
- 可以连续赋值,顺序从右到左
int a, b;
int x[5];
a = 100; // 对变量 a 赋值,正确
3 = 100; // 对常量 3 赋值,错误!
x = 123; // 对数组 b 赋值,错误!
// 连续赋值
a = b = 50; // 先将 50 赋给 b,再将 b 的值赋给 a,正确
- 复合赋值符
- 当左右两边有相同的操作数时,采用复合赋值符不仅直观,且能提高运算效率
- 除了下述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;
6.条件运算符
- 唯一需要三个操作数的运算符
- 语法:表达式1 ? 表达式2 : 表达式3
- 释义:当表达式1为真时,取表达式2,否则取表达式3
- 举例:
int a = 100;
int b = 200;
int m = (a>b) ? a : b; // 如果 a>b 为真,则 m 取 a 的值,否则取 b 的值
7.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);
8.return运算符
- 含义:退出某个函数(如果退出的是主函数main,那么整个程序也就退出了)
- 语法:必须出现在函数体内,可以带函数对应类型的数据
- 举例:
int main()
{
return 0;
}
9.优先级与结合性
- 当表达式中出现不同的运算符时,根据优先级来决定谁先执行,比如先乘除,后加减
- 当表达式中出现多个相同优先级的运算符时,根据结合性来决定谁先运行,比如从左到右