运算符几元的含义
- 这个运算符需要跟几个表达式一起使用
- 一般情况下 一元 > 二元 > 三元
- 一元: a++
- 二元: a + b
- 三元: a ? b : c
算数运算符
- ++
- a++ 先取值 后自增1
- ++a 先自增1 后取值
int a = 7;
printf("%d", a++);
printf("%d", a);

int a = 7;
printf("%d", ++a);
printf("%d", a);

- --
- a-- 先取值 后自增1
- --a 先自增1 后取值
int a = 7;
printf("%d", a++);
printf("%d", a);
int a = 7;
printf("%d", a++);
printf("%d", a);
- +(加) -(减) *(乘) /(除) %(取余)
- 整数相除只保留整数位
- 小数与小数(整数)相除会强转成浮点数
- 取余 只支持整型数据
printf("%d", 1 + 2);
printf("%d", 1 - 2);
printf("%d", 3 * 2);
printf("%d", 7 / 2);
printf("%d", 12 % 9);

- += -= *= /= %=

关系运算符
- < > <= >= == !=
- != 逻辑非(取反)
// 逻辑非(取反)
int age = 17;
if (!(age >= 18)){
printf("测试 \n");
}
int num = 0;
// if (num != 0) // num 非0
if (num) // 真是非0 假0
{
printf("num不等于零 \n");
}
if (num == 0)
if (!num){
printf("num等于零 \n");
}
逻辑运算符
- &&(与) ||(或)|(非)
惰性运算
- &&的惰性运算
- 表达式A && 表达式B
- 若表达式A为假,表达式B不执行
- 表达式A && 表达式B
int n = 77;
if(n > 90 && n++){
}
printf();// 上面利用&&的惰性运算,n++不执行
- ||的惰性运算
- 表达式A || 表达式B
- 若表达式A为真,表达式B不执行
- 表达式A || 表达式B
int n = 14
if(n < 18 || (n += 10)){
}
printf(); //上面利用||的惰性运算,n+=不执行
位运算符
按bit进行运算的运算符
- ~ & | ^ << >>
- ~
- 按位取反……单目运算符,数据的每一个bit位取反
- &
- 按位与……,
- ^
- 按位异或……,
问:有几种方法交换两个变量的值
- 中间变量法
int x ,y, temp; //使用中间变量temp作为中转值
- 加减法
x = x + y;
y = x - y;
x = x - y;
- 异或法
x = x ^ y;
y = x ^ y;
x = x ^ y;
左移运算符
- <<
- 按比特位向左移
- 移出的位全部丢弃,空位全部补0
- 按比特位向左移
- >>
- 按比特位向右移
- 有符号位右移时,需要补符号位(算数位移)
- 逻辑位移不需要补符号位,全部补0
- 按比特位向右移
char b = 0x8f;
char a = 0x8f >> 3;
printf("%#x", b >> 3);//
printf("%#x", a);
补充
0x8f >> 3
0000 0000
0000 0000
0000 0000
0001 0001 0x11
char num2 = 0x8f >> 3;
printf("%hhx \n", num2); // 0x11;
char num = 0x8f;
// 1000 1111
// 1111 0001 111
printf("%hhx \n", num >> 3); // 0xf1
算数位移和逻辑位移
- 算数位移
- 有符号是算数位移
- 逻辑位移
- 无符号是逻辑位移
特殊运算符
- 三目运算符
- 表达式A ? 表达式B : 表达式C
- 判断A是否为真
- 如果A为真,返回B
- 如果A为假,返回C
- 逗号运算符(优先级最低)
(表达式1,表达式2……表达式n)从前向后运行- 返回逗号表达式最右边的值
运算符的优先级
当表达式中有多个同级运算符时,从左到右计算
- 一般情况下 一元 > 二元 > 三元
- 赋值操作低于上面的运算符
- a++ b-- 优先级大于 --b ++a
- * / % 高于 + -
- && 高于 ||

Comments NOTHING