目录
文章目录
运算符
优先级的顺序
算术运算符
单目运算符
说明: ++ – +(正) -(负) *(解引用运算符,后面讲)
++a与**a++**的区别
-
int a = 1,int x = ++a; : ++ 在前,先自加1,后运算
-
int a = 1,int x = a++; : ++ 在后,先运算,后自加1
案例:
总结:
分析上面的案例,我们发现,不管是 ++ 在前,还是 ++ 在后,计算数自身都会+1。区别在于运算的结果不一样。 ++ 在前,先自加1,后运算; ++ 在后,先运算,后自加1。
双目运算符
说明: + - * / %
举例:
#include <stdio.h>
int main()
{
printf(3/2); // 1,为什么不是1.5,因为是整型的运算,会直接舍弃掉小数部分
printf(3*1.0/2); // 1.5 为什么是1.5? 3*1.0:转换为double
printf(10%3);// 1 求模运算
printf(10.0%3);// error 求模运算是针对整数进行的
int a = 10;
printf(a*1.0);
return 0;
}
注意:
- 两个整数相除的结果是整数,小数部分被舍弃。要想其结果是实数,可在分子*1.0(隐式类型转换)
- 求模运算(取余运算)左右两边的操作数都必须是整型。如果是类似于3.0这样的数,是错误的。
关系运算符
说明: >、< 、>= 、<=、 !=、 ==
案例:
什么是表达式?
表达式就是表达某种意思的式子。在C语言中,表达式指的是 运算符 连接 操作数 (变量|常量…)的式子。
注意:
由关系运算符构成的表达式称为关系表达式,关系表达式的值为boolean(布尔值)
非0 :关系成立,为真
0 :关系不成立,为假
逻辑运算符
说明: &&(与) ||(或) !(非)
&& :逻辑与(且),符号两边的操作数都为真,结果才为真。举例: ((5>4)&&(5-4)>1) ,结果 0
|| :逻辑或(或),符号两边的操作数只有有一个为真,结果就为真。举例: ((5>4)||(5-4)>1) ,结果 1
! :逻辑反(取反),取反,非0为真,举例: !(!(5>4)) ,结果 1
惰性运算
所谓的惰性运算,就是减少运算次数。
短路与: && 两边的操作数,只要左边不成立 0 ,直接返回假,不再校验右边。
短路或: || 两边的操作数,只要左边成立 1 ,直接返回真,不再校验右边。
三目运算符
语法: 表达式1?表达式2:表达式3 ,其实就是if…else…简化版
求值顺序:
-
如果表达式1的值为1,则整个条件运算表达式的值为表达式2的值;
-
如果表达式1的值为0,则整个条件运算表达式的值为表达式3的值;
// 案例1
// 需求:根据考试成绩进行奖励和乘法
// score >= 90 奖励外星人电脑一台
// score < 90 奖励刷锅刷碗1个月
int score = 89;
printf("%s",score >= 90 ? "奖励外星人电脑一台":"奖励刷锅刷碗1个月"); // 奖励刷锅刷碗1个月
// 案例2
int a = 10,b = 20;
int ret = a>b?++a:++b;
printf("ret:%d a:%d b:%d",ret,a,b);// ret=21,a=10,b=21
位运算符
说明:按位(bit) 来进行运算操作的运算符。
语法: ~、&、|、^、<<、>>
**~:**按位取反
说明:单目运算符,数据的每一个bit位取反,也就是二进制数位上的1变0,0变1。
举例:
unsigned char ret = ~0x05; // 0000 0101 --> 1111 1010
printf("%d\n",~5); // -6
‘&’按位与
语法: a & b
说明:首先将参与计算的操作数转换为二级制,然后按照每一位进行对齐,处理结果如下:
& | 0 | 1 |
---|---|---|
0 | 0 | 0 |
1 | 0 | 1 |
总结:如果我们前后两个操作数对齐位置上的二进制数字都是1,其结果是1,否则结果都是0
‘|’按位或
语法: a | b
说明:首先将参与计算的操作数转换为二级制,然后按照每一位进行对齐,处理结果如下:
| | 0 | 1 |
---|---|---|
0 | 0 | 1 |
1 | 1 | 1 |
总结:如果我们前后两个操作数对齐位置上的二进制数字只要有1,其结果是1,否则结果都是0
‘^’按位异或
语法: a ^ b
说明:首先将参与计算的操作数转换为二级制,然后按照每一位进行对齐,处理结果如下:
^ | 0 | 1 |
---|---|---|
0 | 0 | 1 |
1 | 1 | 0 |
总结:不同为1,相同为0
<<:左移,按bit位往左偏移
- 无符号左移:
语法: 操作数 << 移动位数(bit位)
unsigned int a = 3 << 3; // 快速计算:3 * 2^3
printf("%d\n",a); // 24
- 有符号左移:
语法: 操作数 << 移动位数(bit位)
int a = -3 << 3; // 快速计算:-3 * 2^3
printf("%d\n",a);// -24
>>:右移,按bit位往右偏移
- 无符号右移:
语法: 操作数 >> 移动位数(bit位)
unsigned char a = 3 >> 3;
printf("%d\n",a); // 0
- 有符号右移:
语法: 操作数 >> 移动位数(bit位)
int a = -3 >> 3;
printf("%d\n",a);// -1
注意
-
在进行移位运算的时候,凡是被移出去的位统统丢弃,凡是空出来的位统统补0。移位运算针对的是无符号整数。
-
如果非要进行有符号的移位运算,那么左移的时候,空出来的补0,右移的时候,空出来的补符号位(原码阶段)。
赋值运算符
包含: = ,由 右 -> 左,优先级排倒数第二。
int a = 4;
int num = 5 +6;
注意:赋值运算符的左边(左操作数)必须是可写的地址。
复合赋值运算符
包含: += -= *= /= %= ,由 右 -> 左,优先级倒数第二。
int i = 1;
i+=1; // 等价于 i = i+1
i*=5; // 等价于 i = i * 5
sizeof(int)
说明:用来计算某种类型或者变量所占的字节数。(中文英文字符集问题,不标准)
逗号运算符(,)
说明:优先级最低,左->右,由多个运算符将多个不同的式子连接起来的表达式称之为逗号表达式
语法:
(表达式1,表达式2...表达式n);
求值顺序:先求表达式1,再求表达式2,以此类推,整个逗号表达式的值为表达式n的值。
注意:
- 逗号表达式的优先级最低
- 运算顺序从左往右
- 整个逗号表达式的值取决于最右边的表达式的值
举例:
int a = 5,b = 3;
int ret = (a>b,a++,b++,a);// 这种写法其实就是为了减少代码量
printf("ret:%d\n",ret);